| // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| library parser_helper; |
| |
| import "package:expect/expect.dart"; |
| |
| import "package:compiler/src/elements/elements.dart"; |
| import "package:compiler/src/tree/tree.dart"; |
| import "package:compiler/src/scanner/scannerlib.dart"; |
| import "package:compiler/src/io/source_file.dart"; |
| import "package:compiler/src/util/util.dart"; |
| |
| import "package:compiler/src/elements/modelx.dart" |
| show CompilationUnitElementX, ElementX, LibraryElementX; |
| |
| import "package:compiler/src/dart2jslib.dart"; |
| |
| export "package:compiler/src/dart2jslib.dart" |
| show DiagnosticListener; |
| // TODO(ahe): We should have token library to export instead. |
| export "package:compiler/src/scanner/scannerlib.dart"; |
| |
| class LoggerCanceler implements DiagnosticListener { |
| void cancel(String reason, {node, token, instruction, element}) { |
| throw new CompilerCancelledException(reason); |
| } |
| |
| void log(message) { |
| print(message); |
| } |
| |
| void internalError(node, String message) { |
| log(message); |
| } |
| |
| SourceSpan spanFromSpannable(node) { |
| throw 'unsupported operation'; |
| } |
| |
| void reportMessage(SourceSpan span, Message message, kind) { |
| log(message); |
| } |
| |
| void reportFatalError(Spannable node, |
| MessageKind errorCode, |
| [Map arguments]) { |
| log(new Message(errorCode, arguments, false)); |
| } |
| |
| void reportError(Spannable node, MessageKind errorCode, [Map arguments]) { |
| log(new Message(errorCode, arguments, false)); |
| } |
| |
| void reportWarning(Spannable node, MessageKind errorCode, [Map arguments]) { |
| log(new Message(errorCode, arguments, false)); |
| } |
| |
| void reportInfo(Spannable node, MessageKind errorCode, [Map arguments]) { |
| log(new Message(errorCode, arguments, false)); |
| } |
| |
| void reportHint(Spannable node, MessageKind errorCode, [Map arguments]) { |
| log(new Message(errorCode, arguments, false)); |
| } |
| |
| withCurrentElement(Element element, f()) => f(); |
| } |
| |
| Token scan(String text) => new StringScanner.fromString(text).tokenize(); |
| |
| Node parseBodyCode(String text, Function parseMethod, |
| {DiagnosticListener diagnosticHandler}) { |
| Token tokens = scan(text); |
| if (diagnosticHandler == null) diagnosticHandler = new LoggerCanceler(); |
| Uri uri = new Uri(scheme: "source"); |
| Script script = new Script(uri, uri,new MockFile(text)); |
| LibraryElement library = new LibraryElementX(script); |
| library.canUseNative = true; |
| NodeListener listener = |
| new NodeListener(diagnosticHandler, library.entryCompilationUnit); |
| Parser parser = new Parser(listener); |
| Token endToken = parseMethod(parser, tokens); |
| assert(endToken.kind == EOF_TOKEN); |
| Node node = listener.popNode(); |
| Expect.isNotNull(node); |
| Expect.isTrue(listener.nodes.isEmpty, 'Not empty: ${listener.nodes}'); |
| return node; |
| } |
| |
| Node parseStatement(String text) => |
| parseBodyCode(text, (parser, tokens) => parser.parseStatement(tokens)); |
| |
| Node parseFunction(String text, Compiler compiler) { |
| ElementX element = parseUnit(text, compiler, compiler.mainApp).head; |
| Expect.isNotNull(element); |
| Expect.equals(ElementKind.FUNCTION, element.kind); |
| return element.parseNode(compiler); |
| } |
| |
| Node parseMember(String text, {DiagnosticListener diagnosticHandler}) { |
| return parseBodyCode(text, (parser, tokens) => parser.parseMember(tokens), |
| diagnosticHandler: diagnosticHandler); |
| } |
| |
| class MockFile extends StringSourceFile { |
| MockFile(text) |
| : super('<string>', text); |
| } |
| |
| var sourceCounter = 0; |
| |
| Link<Element> parseUnit(String text, Compiler compiler, |
| LibraryElement library, |
| [void registerSource(Uri uri, String source)]) { |
| Token tokens = scan(text); |
| Uri uri = new Uri(scheme: "source", path: '${++sourceCounter}'); |
| if (registerSource != null) { |
| registerSource(uri, text); |
| } |
| var script = new Script(uri, uri, new MockFile(text)); |
| var unit = new CompilationUnitElementX(script, library); |
| int id = 0; |
| ElementListener listener = new ElementListener(compiler, unit, () => id++); |
| PartialParser parser = new PartialParser(listener); |
| compiler.withCurrentElement(unit, () => parser.parseUnit(tokens)); |
| return unit.localMembers; |
| } |
| |
| NodeList fullParseUnit(String source, {DiagnosticListener diagnosticHandler}) { |
| return parseBodyCode(source, (parser, tokens) => parser.parseUnit(tokens), |
| diagnosticHandler: diagnosticHandler); |
| } |