]> git.saurik.com Git - apple/javascriptcore.git/blame - kjs/Parser.h
JavaScriptCore-466.1.6.tar.gz
[apple/javascriptcore.git] / kjs / Parser.h
CommitLineData
b37bf2e1
A
1// -*- c-basic-offset: 4 -*-
2/*
3 * This file is part of the KDE libraries
4 * Copyright (C) 1999-2001 Harri Porten (porten@kde.org)
5 * Copyright (C) 2001 Peter Kelly (pmk@post.com)
6 * Copyright (C) 2003, 2006, 2007 Apple Inc.
7 *
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Library General Public
10 * License as published by the Free Software Foundation; either
11 * version 2 of the License, or (at your option) any later version.
12 *
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Library General Public License for more details.
17 *
18 * You should have received a copy of the GNU Library General Public License
19 * along with this library; see the file COPYING.LIB. If not, write to
20 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21 * Boston, MA 02110-1301, USA.
22 *
23 */
24
25#ifndef Parser_h
26#define Parser_h
27
b5422865
A
28#include "SourceProvider.h"
29#include "nodes.h"
b37bf2e1
A
30#include <wtf/Forward.h>
31#include <wtf/Noncopyable.h>
32#include <wtf/OwnPtr.h>
33#include <wtf/RefPtr.h>
b37bf2e1
A
34
35namespace KJS {
36
37 class FunctionBodyNode;
38 class ProgramNode;
39 class UString;
40
41 struct UChar;
42
43 template <typename T> struct ParserRefCountedData : ParserRefCounted {
44 T data;
45 };
46
47 class Parser : Noncopyable {
48 public:
b5422865
A
49 template <class ParsedNode> PassRefPtr<ParsedNode> parse(PassRefPtr<SourceProvider>, int* errLine = 0, UString* errMsg = 0);
50 template <class ParsedNode> PassRefPtr<ParsedNode> parse(const SourceCode&, int* errLine = 0, UString* errMsg = 0);
b37bf2e1
A
51
52 void didFinishParsing(SourceElements*, ParserRefCountedData<DeclarationStacks::VarStack>*,
53 ParserRefCountedData<DeclarationStacks::FunctionStack>*, int lastLine);
54
b5422865
A
55 void reparse(FunctionBodyNode*);
56
b37bf2e1
A
57 private:
58 friend Parser& parser();
59
b5422865 60 void parse(int* errLine, UString* errMsg);
b37bf2e1 61
b5422865 62 const SourceCode* m_source;
b37bf2e1
A
63 RefPtr<SourceElements> m_sourceElements;
64 RefPtr<ParserRefCountedData<DeclarationStacks::VarStack> > m_varDeclarations;
65 RefPtr<ParserRefCountedData<DeclarationStacks::FunctionStack> > m_funcDeclarations;
66 int m_lastLine;
67 };
68
69 Parser& parser(); // Returns the singleton JavaScript parser.
70
b5422865 71 template <class ParsedNode> PassRefPtr<ParsedNode> Parser::parse(const SourceCode& source, int* errLine, UString* errMsg)
b37bf2e1 72 {
b5422865
A
73 m_source = &source;
74 parse(errLine, errMsg);
75 RefPtr<ParsedNode> result;
76 if (m_sourceElements) {
77 result = ParsedNode::create(*m_source,
78 m_sourceElements.get(),
79 m_varDeclarations ? &m_varDeclarations->data : 0,
80 m_funcDeclarations ? &m_funcDeclarations->data : 0);
81 result->setLoc(m_source->firstLine(), m_lastLine);
b37bf2e1 82 }
b5422865
A
83
84 m_source = 0;
85 m_sourceElements = 0;
b37bf2e1
A
86 m_varDeclarations = 0;
87 m_funcDeclarations = 0;
b5422865 88 return result.release();
b37bf2e1
A
89 }
90
91} // namespace KJS
92
93#endif // Parser_h