OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 library engine.resolver; | 5 library engine.resolver; |
6 | 6 |
7 import 'dart:collection'; | 7 import 'dart:collection'; |
8 | 8 |
9 import 'ast.dart'; | 9 import 'ast.dart'; |
10 import 'constant.dart'; | 10 import 'constant.dart'; |
(...skipping 7070 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7081 * @throws AnalysisException if the analysis could not be performed | 7081 * @throws AnalysisException if the analysis could not be performed |
7082 */ | 7082 */ |
7083 LibraryElementImpl buildLibrary(Library library) { | 7083 LibraryElementImpl buildLibrary(Library library) { |
7084 CompilationUnitBuilder builder = new CompilationUnitBuilder(); | 7084 CompilationUnitBuilder builder = new CompilationUnitBuilder(); |
7085 Source librarySource = library.librarySource; | 7085 Source librarySource = library.librarySource; |
7086 CompilationUnit definingCompilationUnit = library.definingCompilationUnit; | 7086 CompilationUnit definingCompilationUnit = library.definingCompilationUnit; |
7087 CompilationUnitElementImpl definingCompilationUnitElement = builder | 7087 CompilationUnitElementImpl definingCompilationUnitElement = builder |
7088 .buildCompilationUnit( | 7088 .buildCompilationUnit( |
7089 librarySource, definingCompilationUnit, librarySource); | 7089 librarySource, definingCompilationUnit, librarySource); |
7090 NodeList<Directive> directives = definingCompilationUnit.directives; | 7090 NodeList<Directive> directives = definingCompilationUnit.directives; |
| 7091 LibraryDirective libraryDirective = null; |
7091 LibraryIdentifier libraryNameNode = null; | 7092 LibraryIdentifier libraryNameNode = null; |
7092 bool hasPartDirective = false; | 7093 bool hasPartDirective = false; |
7093 FunctionElement entryPoint = | 7094 FunctionElement entryPoint = |
7094 _findEntryPoint(definingCompilationUnitElement); | 7095 _findEntryPoint(definingCompilationUnitElement); |
7095 List<Directive> directivesToResolve = new List<Directive>(); | 7096 List<Directive> directivesToResolve = new List<Directive>(); |
7096 List<CompilationUnitElementImpl> sourcedCompilationUnits = | 7097 List<CompilationUnitElementImpl> sourcedCompilationUnits = |
7097 new List<CompilationUnitElementImpl>(); | 7098 new List<CompilationUnitElementImpl>(); |
7098 for (Directive directive in directives) { | 7099 for (Directive directive in directives) { |
7099 // | 7100 // |
7100 // We do not build the elements representing the import and export | 7101 // We do not build the elements representing the import and export |
7101 // directives at this point. That is not done until we get to | 7102 // directives at this point. That is not done until we get to |
7102 // LibraryResolver.buildDirectiveModels() because we need the | 7103 // LibraryResolver.buildDirectiveModels() because we need the |
7103 // LibraryElements for the referenced libraries, which might not exist at | 7104 // LibraryElements for the referenced libraries, which might not exist at |
7104 // this point (due to the possibility of circular references). | 7105 // this point (due to the possibility of circular references). |
7105 // | 7106 // |
7106 if (directive is LibraryDirective) { | 7107 if (directive is LibraryDirective) { |
7107 if (libraryNameNode == null) { | 7108 if (libraryNameNode == null) { |
| 7109 libraryDirective = directive; |
7108 libraryNameNode = directive.name; | 7110 libraryNameNode = directive.name; |
7109 directivesToResolve.add(directive); | 7111 directivesToResolve.add(directive); |
7110 } | 7112 } |
7111 } else if (directive is PartDirective) { | 7113 } else if (directive is PartDirective) { |
7112 PartDirective partDirective = directive; | 7114 PartDirective partDirective = directive; |
7113 StringLiteral partUri = partDirective.uri; | 7115 StringLiteral partUri = partDirective.uri; |
7114 Source partSource = partDirective.source; | 7116 Source partSource = partDirective.source; |
7115 if (_analysisContext.exists(partSource)) { | 7117 if (_analysisContext.exists(partSource)) { |
7116 hasPartDirective = true; | 7118 hasPartDirective = true; |
7117 CompilationUnit partUnit = library.getAST(partSource); | 7119 CompilationUnit partUnit = library.getAST(partSource); |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7156 } | 7158 } |
7157 if (hasPartDirective && libraryNameNode == null) { | 7159 if (hasPartDirective && libraryNameNode == null) { |
7158 _errorListener.onError(new AnalysisError(librarySource, 0, 0, | 7160 _errorListener.onError(new AnalysisError(librarySource, 0, 0, |
7159 ResolverErrorCode.MISSING_LIBRARY_DIRECTIVE_WITH_PART)); | 7161 ResolverErrorCode.MISSING_LIBRARY_DIRECTIVE_WITH_PART)); |
7160 } | 7162 } |
7161 // | 7163 // |
7162 // Create and populate the library element. | 7164 // Create and populate the library element. |
7163 // | 7165 // |
7164 LibraryElementImpl libraryElement = new LibraryElementImpl.forNode( | 7166 LibraryElementImpl libraryElement = new LibraryElementImpl.forNode( |
7165 _analysisContext.getContextFor(librarySource), libraryNameNode); | 7167 _analysisContext.getContextFor(librarySource), libraryNameNode); |
| 7168 _setDocRange(libraryElement, libraryDirective); |
7166 libraryElement.definingCompilationUnit = definingCompilationUnitElement; | 7169 libraryElement.definingCompilationUnit = definingCompilationUnitElement; |
7167 if (entryPoint != null) { | 7170 if (entryPoint != null) { |
7168 libraryElement.entryPoint = entryPoint; | 7171 libraryElement.entryPoint = entryPoint; |
7169 } | 7172 } |
7170 int sourcedUnitCount = sourcedCompilationUnits.length; | 7173 int sourcedUnitCount = sourcedCompilationUnits.length; |
7171 libraryElement.parts = sourcedCompilationUnits; | 7174 libraryElement.parts = sourcedCompilationUnits; |
7172 for (Directive directive in directivesToResolve) { | 7175 for (Directive directive in directivesToResolve) { |
7173 directive.element = libraryElement; | 7176 directive.element = libraryElement; |
7174 } | 7177 } |
7175 library.libraryElement = libraryElement; | 7178 library.libraryElement = libraryElement; |
(...skipping 11 matching lines...) Expand all Loading... |
7187 * @throws AnalysisException if the analysis could not be performed | 7190 * @throws AnalysisException if the analysis could not be performed |
7188 */ | 7191 */ |
7189 void buildLibrary2(ResolvableLibrary library) { | 7192 void buildLibrary2(ResolvableLibrary library) { |
7190 CompilationUnitBuilder builder = new CompilationUnitBuilder(); | 7193 CompilationUnitBuilder builder = new CompilationUnitBuilder(); |
7191 Source librarySource = library.librarySource; | 7194 Source librarySource = library.librarySource; |
7192 CompilationUnit definingCompilationUnit = library.definingCompilationUnit; | 7195 CompilationUnit definingCompilationUnit = library.definingCompilationUnit; |
7193 CompilationUnitElementImpl definingCompilationUnitElement = builder | 7196 CompilationUnitElementImpl definingCompilationUnitElement = builder |
7194 .buildCompilationUnit( | 7197 .buildCompilationUnit( |
7195 librarySource, definingCompilationUnit, librarySource); | 7198 librarySource, definingCompilationUnit, librarySource); |
7196 NodeList<Directive> directives = definingCompilationUnit.directives; | 7199 NodeList<Directive> directives = definingCompilationUnit.directives; |
| 7200 LibraryDirective libraryDirective = null; |
7197 LibraryIdentifier libraryNameNode = null; | 7201 LibraryIdentifier libraryNameNode = null; |
7198 bool hasPartDirective = false; | 7202 bool hasPartDirective = false; |
7199 FunctionElement entryPoint = | 7203 FunctionElement entryPoint = |
7200 _findEntryPoint(definingCompilationUnitElement); | 7204 _findEntryPoint(definingCompilationUnitElement); |
7201 List<Directive> directivesToResolve = new List<Directive>(); | 7205 List<Directive> directivesToResolve = new List<Directive>(); |
7202 List<CompilationUnitElementImpl> sourcedCompilationUnits = | 7206 List<CompilationUnitElementImpl> sourcedCompilationUnits = |
7203 new List<CompilationUnitElementImpl>(); | 7207 new List<CompilationUnitElementImpl>(); |
7204 for (Directive directive in directives) { | 7208 for (Directive directive in directives) { |
7205 // | 7209 // |
7206 // We do not build the elements representing the import and export | 7210 // We do not build the elements representing the import and export |
7207 // directives at this point. That is not done until we get to | 7211 // directives at this point. That is not done until we get to |
7208 // LibraryResolver.buildDirectiveModels() because we need the | 7212 // LibraryResolver.buildDirectiveModels() because we need the |
7209 // LibraryElements for the referenced libraries, which might not exist at | 7213 // LibraryElements for the referenced libraries, which might not exist at |
7210 // this point (due to the possibility of circular references). | 7214 // this point (due to the possibility of circular references). |
7211 // | 7215 // |
7212 if (directive is LibraryDirective) { | 7216 if (directive is LibraryDirective) { |
7213 if (libraryNameNode == null) { | 7217 if (libraryNameNode == null) { |
| 7218 libraryDirective = directive; |
7214 libraryNameNode = directive.name; | 7219 libraryNameNode = directive.name; |
7215 directivesToResolve.add(directive); | 7220 directivesToResolve.add(directive); |
7216 } | 7221 } |
7217 } else if (directive is PartDirective) { | 7222 } else if (directive is PartDirective) { |
7218 PartDirective partDirective = directive; | 7223 PartDirective partDirective = directive; |
7219 StringLiteral partUri = partDirective.uri; | 7224 StringLiteral partUri = partDirective.uri; |
7220 Source partSource = partDirective.source; | 7225 Source partSource = partDirective.source; |
7221 if (_analysisContext.exists(partSource)) { | 7226 if (_analysisContext.exists(partSource)) { |
7222 hasPartDirective = true; | 7227 hasPartDirective = true; |
7223 CompilationUnit partUnit = library.getAST(partSource); | 7228 CompilationUnit partUnit = library.getAST(partSource); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7264 } | 7269 } |
7265 if (hasPartDirective && libraryNameNode == null) { | 7270 if (hasPartDirective && libraryNameNode == null) { |
7266 _errorListener.onError(new AnalysisError(librarySource, 0, 0, | 7271 _errorListener.onError(new AnalysisError(librarySource, 0, 0, |
7267 ResolverErrorCode.MISSING_LIBRARY_DIRECTIVE_WITH_PART)); | 7272 ResolverErrorCode.MISSING_LIBRARY_DIRECTIVE_WITH_PART)); |
7268 } | 7273 } |
7269 // | 7274 // |
7270 // Create and populate the library element. | 7275 // Create and populate the library element. |
7271 // | 7276 // |
7272 LibraryElementImpl libraryElement = new LibraryElementImpl.forNode( | 7277 LibraryElementImpl libraryElement = new LibraryElementImpl.forNode( |
7273 _analysisContext.getContextFor(librarySource), libraryNameNode); | 7278 _analysisContext.getContextFor(librarySource), libraryNameNode); |
| 7279 _setDocRange(libraryElement, libraryDirective); |
7274 libraryElement.definingCompilationUnit = definingCompilationUnitElement; | 7280 libraryElement.definingCompilationUnit = definingCompilationUnitElement; |
7275 if (entryPoint != null) { | 7281 if (entryPoint != null) { |
7276 libraryElement.entryPoint = entryPoint; | 7282 libraryElement.entryPoint = entryPoint; |
7277 } | 7283 } |
7278 int sourcedUnitCount = sourcedCompilationUnits.length; | 7284 int sourcedUnitCount = sourcedCompilationUnits.length; |
7279 libraryElement.parts = sourcedCompilationUnits; | 7285 libraryElement.parts = sourcedCompilationUnits; |
7280 for (Directive directive in directivesToResolve) { | 7286 for (Directive directive in directivesToResolve) { |
7281 directive.element = libraryElement; | 7287 directive.element = libraryElement; |
7282 } | 7288 } |
7283 library.libraryElement = libraryElement; | 7289 library.libraryElement = libraryElement; |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7367 for (PropertyAccessorElement setter in setters) { | 7373 for (PropertyAccessorElement setter in setters) { |
7368 PropertyAccessorElement getter = getters[setter.displayName]; | 7374 PropertyAccessorElement getter = getters[setter.displayName]; |
7369 if (getter != null) { | 7375 if (getter != null) { |
7370 PropertyInducingElementImpl variable = | 7376 PropertyInducingElementImpl variable = |
7371 getter.variable as PropertyInducingElementImpl; | 7377 getter.variable as PropertyInducingElementImpl; |
7372 variable.setter = setter; | 7378 variable.setter = setter; |
7373 (setter as PropertyAccessorElementImpl).variable = variable; | 7379 (setter as PropertyAccessorElementImpl).variable = variable; |
7374 } | 7380 } |
7375 } | 7381 } |
7376 } | 7382 } |
| 7383 |
| 7384 /** |
| 7385 * If the given [node] has a documentation comment, remember its range |
| 7386 * into the given [element]. |
| 7387 */ |
| 7388 void _setDocRange(ElementImpl element, AnnotatedNode node) { |
| 7389 Comment comment = node.documentationComment; |
| 7390 if (comment != null && comment.isDocumentation) { |
| 7391 element.setDocRange(comment.offset, comment.length); |
| 7392 } |
| 7393 } |
7377 } | 7394 } |
7378 | 7395 |
7379 /** | 7396 /** |
7380 * Instances of the class `LibraryImportScope` represent the scope containing al
l of the names | 7397 * Instances of the class `LibraryImportScope` represent the scope containing al
l of the names |
7381 * available from imported libraries. | 7398 * available from imported libraries. |
7382 */ | 7399 */ |
7383 class LibraryImportScope extends Scope { | 7400 class LibraryImportScope extends Scope { |
7384 /** | 7401 /** |
7385 * The element representing the library in which this scope is enclosed. | 7402 * The element representing the library in which this scope is enclosed. |
7386 */ | 7403 */ |
(...skipping 8540 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
15927 nonFields.add(node); | 15944 nonFields.add(node); |
15928 return null; | 15945 return null; |
15929 } | 15946 } |
15930 | 15947 |
15931 @override | 15948 @override |
15932 Object visitNode(AstNode node) => node.accept(TypeResolverVisitor_this); | 15949 Object visitNode(AstNode node) => node.accept(TypeResolverVisitor_this); |
15933 | 15950 |
15934 @override | 15951 @override |
15935 Object visitWithClause(WithClause node) => null; | 15952 Object visitWithClause(WithClause node) => null; |
15936 } | 15953 } |
OLD | NEW |