Chromium Code Reviews| Index: pkg/kernel/lib/analyzer/loader.dart |
| diff --git a/pkg/kernel/lib/analyzer/loader.dart b/pkg/kernel/lib/analyzer/loader.dart |
| index fb523000daa7dfbe3c33803eee39bcfd0881b10f..3766104baae669654559ec5d416f919b9b875c04 100644 |
| --- a/pkg/kernel/lib/analyzer/loader.dart |
| +++ b/pkg/kernel/lib/analyzer/loader.dart |
| @@ -109,8 +109,8 @@ class DartLoader implements ReferenceLevelLoader { |
| ..fileUri = "file://${element.source.fullName}"; |
| } |
| - void _buildTopLevelMember(ast.Member member, Element element) { |
| - var astNode = element.computeNode(); |
| + void _buildTopLevelMember( |
| + ast.Member member, Element element, Declaration astNode) { |
| assert(member.parent != null); |
| new MemberBodyBuilder(this, member, element).build(astNode); |
| } |
| @@ -124,45 +124,57 @@ class DartLoader implements ReferenceLevelLoader { |
| return _libraryBeingLoaded == element; |
| } |
| - void _buildLibraryBody(LibraryElement element, ast.Library library) { |
| + void _buildLibraryBody(LibraryElement element, ast.Library library, |
| + List<CompilationUnit> units) { |
| assert(_libraryBeingLoaded == null); |
| _libraryBeingLoaded = element; |
| var classes = <ast.Class>[]; |
| var procedures = <ast.Procedure>[]; |
| var fields = <ast.Field>[]; |
| - void loadClass(ClassElement classElement) { |
| - var node = getClassReference(classElement); |
| - promoteToBodyLevel(node); |
| + |
| + void loadClass(NamedCompilationUnitMember declaration) { |
| + // [declaration] can be a ClassDeclaration, EnumDeclaration, or a |
| + // ClassTypeAlias. |
| + ClassElement element = declaration.element; |
| + var node = getClassReference(element); |
| + promoteToBodyLevel(node, element, declaration); |
| classes.add(node); |
| } |
| - void loadProcedure(Element memberElement) { |
| - var node = getMemberReference(memberElement); |
| - _buildTopLevelMember(node, memberElement); |
| + void loadProcedure(FunctionDeclaration declaration) { |
| + var element = declaration.element; |
| + var node = getMemberReference(element); |
| + _buildTopLevelMember(node, element, declaration); |
| procedures.add(node); |
| } |
| - void loadField(Element memberElement) { |
| - var node = getMemberReference(memberElement); |
| - _buildTopLevelMember(node, memberElement); |
| - fields.add(node); |
| + void loadField(TopLevelVariableDeclaration declaration) { |
| + for (var field in declaration.variables.variables) { |
| + var element = field.element; |
| + // Ignore fields inserted through error recovery. |
| + if (element.name == '') continue; |
| + var node = getMemberReference(element); |
| + _buildTopLevelMember(node, element, field); |
| + fields.add(node); |
| + } |
| } |
| - for (var unit in element.units) { |
| - unit.types.forEach(loadClass); |
| - unit.enums.forEach(loadClass); |
| - for (var accessor in unit.accessors) { |
| - if (!accessor.isSynthetic) { |
| - loadProcedure(accessor); |
| - } |
| - } |
| - for (var function in unit.functions) { |
| - loadProcedure(function); |
| - } |
| - for (var field in unit.topLevelVariables) { |
| - // Ignore fields inserted through error recovery. |
| - if (!field.isSynthetic && field.name != '') { |
| - loadField(field); |
| + for (var unit in units) { |
| + for (CompilationUnitMember declaration in unit.declarations) { |
| + if (declaration is ClassDeclaration || |
| + declaration is EnumDeclaration || |
| + declaration is ClassTypeAlias) { |
| + loadClass(declaration); |
| + } else if (declaration is FunctionDeclaration) { |
| + loadProcedure(declaration); |
| + } else if (declaration is TopLevelVariableDeclaration) { |
| + loadField(declaration); |
| + } else if (declaration is FunctionTypeAlias) { |
| + // Nothing to do. Typedefs are handled lazily while constructing type |
| + // references. |
| + } else { |
| + throw "unexpected node: ${declaration.runtimeType} $declaration"; |
| + assert(false); // unreachable. |
|
asgerf
2016/12/07 11:34:00
Was it intended to have both throw and assert(fals
Siggi Cherem (dart-lang)
2016/12/07 15:34:30
Done. Oops, I started with the assert, but then ad
|
| } |
| } |
| } |
| @@ -352,13 +364,11 @@ class DartLoader implements ReferenceLevelLoader { |
| } |
| } |
| - void promoteToBodyLevel(ast.Class classNode) { |
| + void promoteToBodyLevel(ast.Class classNode, ClassElement element, |
| + NamedCompilationUnitMember astNode) { |
| if (classNode.level == ast.ClassLevel.Body) return; |
| promoteToHierarchyLevel(classNode); |
| classNode.level = ast.ClassLevel.Body; |
| - var element = getClassElement(classNode); |
| - if (element == null) return; |
| - var astNode = element.computeNode(); |
| // Clear out the member references that were put in the class. |
| // The AST builder will load them all put back in the right order. |
| classNode..fields.clear()..procedures.clear()..constructors.clear(); |
| @@ -585,20 +595,28 @@ class DartLoader implements ReferenceLevelLoader { |
| .forUri2(applicationRoot.absoluteUri(node.importUri)); |
| assert(source != null); |
| var element = context.computeLibraryElement(source); |
| - context.resolveCompilationUnit(source, element); |
| - _buildLibraryBody(element, node); |
| - if (node.importUri.scheme != 'dart') { |
| - for (var unit in element.units) { |
| - LineInfo lines; |
| - for (var error in context.computeErrors(unit.source)) { |
| - if (error.errorCode is CompileTimeErrorCode || |
| - error.errorCode is ParserErrorCode || |
| - error.errorCode is ScannerErrorCode || |
| - error.errorCode is StrongModeCode) { |
| - lines ??= context.computeLineInfo(source); |
| - errors.add(formatErrorMessage(error, source.shortName, lines)); |
| - } |
| - } |
| + var units = []; |
|
asgerf
2016/12/07 11:34:00
Add a type annotation here (to the list or the var
Siggi Cherem (dart-lang)
2016/12/07 15:34:30
Done, thanks. I keep forgetting that I need to run
|
| + bool reportErrors = node.importUri.scheme != 'dart'; |
| + var tree = context.resolveCompilationUnit(source, element); |
| + units.add(tree); |
| + if (reportErrors) _processErrors(source); |
| + for (var part in element.parts) { |
| + var source = part.source; |
| + units.add(context.resolveCompilationUnit(source, element)); |
| + if (reportErrors) _processErrors(source); |
| + } |
| + _buildLibraryBody(element, node, units); |
| + } |
| + |
| + void _processErrors(Source source) { |
| + LineInfo lines; |
| + for (var error in context.computeErrors(source)) { |
| + if (error.errorCode is CompileTimeErrorCode || |
| + error.errorCode is ParserErrorCode || |
| + error.errorCode is ScannerErrorCode || |
| + error.errorCode is StrongModeCode) { |
| + lines ??= context.computeLineInfo(source); |
| + errors.add(formatErrorMessage(error, source.shortName, lines)); |
| } |
| } |
| } |
| @@ -655,10 +673,10 @@ class DartLoader implements ReferenceLevelLoader { |
| for (LibraryElement libraryElement in libraryElements) { |
| for (CompilationUnitElement compilationUnitElement |
| in libraryElement.units) { |
| + var source = compilationUnitElement.source; |
| // TODO(jensj): Get this another way? |
|
Paul Berry
2016/12/07 13:46:46
I'm guessing this TODO comment had to do with the
jensj
2016/12/07 14:02:21
Actually it wasn't about the computeNode, but you
Siggi Cherem (dart-lang)
2016/12/07 15:34:30
Done.
|
| - LineInfo lineInfo = compilationUnitElement.computeNode().lineInfo; |
| - program.uriToLineStarts[ |
| - "file://${compilationUnitElement.source.source.fullName}"] = |
| + LineInfo lineInfo = context.computeLineInfo(source); |
| + program.uriToLineStarts["file://${source.fullName}"] = |
| new List<int>.generate(lineInfo.lineCount, lineInfo.getOffsetOfLine, |
| growable: false); |
| } |