| 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 // This code was auto-generated, is not intended to be edited, and is subject to | 5 // This code was auto-generated, is not intended to be edited, and is subject to |
| 6 // significant change. Please see the README file for more information. | 6 // significant change. Please see the README file for more information. |
| 7 | 7 |
| 8 library engine.resolver; | 8 library engine.resolver; |
| 9 | 9 |
| 10 import 'dart:collection'; | 10 import 'dart:collection'; |
| (...skipping 3845 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3856 } | 3856 } |
| 3857 | 3857 |
| 3858 /** | 3858 /** |
| 3859 * Given some [NodeList] of [Annotation]s, ensure that the identifiers are vis
ited by | 3859 * Given some [NodeList] of [Annotation]s, ensure that the identifiers are vis
ited by |
| 3860 * this visitor. Specifically, this covers the cases where AST nodes don't hav
e their identifiers | 3860 * this visitor. Specifically, this covers the cases where AST nodes don't hav
e their identifiers |
| 3861 * visited by this visitor, but still need their annotations visited. | 3861 * visited by this visitor, but still need their annotations visited. |
| 3862 * | 3862 * |
| 3863 * @param annotations the list of annotations to visit | 3863 * @param annotations the list of annotations to visit |
| 3864 */ | 3864 */ |
| 3865 void _visitMetadata(NodeList<Annotation> annotations) { | 3865 void _visitMetadata(NodeList<Annotation> annotations) { |
| 3866 for (Annotation annotation in annotations) { | 3866 int count = annotations.length; |
| 3867 Identifier name = annotation.name; | 3867 for (int i = 0; i < count; i++) { |
| 3868 _visitIdentifier(name.staticElement, name.name); | 3868 annotations[i].accept(this); |
| 3869 } | 3869 } |
| 3870 } | 3870 } |
| 3871 } | 3871 } |
| 3872 | 3872 |
| 3873 /** | 3873 /** |
| 3874 * Instances of the class `OverrideVerifier` visit all of the declarations in a
compilation | 3874 * Instances of the class `OverrideVerifier` visit all of the declarations in a
compilation |
| 3875 * unit to verify that if they have an override annotation it is being used corr
ectly. | 3875 * unit to verify that if they have an override annotation it is being used corr
ectly. |
| 3876 */ | 3876 */ |
| 3877 class OverrideVerifier extends RecursiveAstVisitor<Object> { | 3877 class OverrideVerifier extends RecursiveAstVisitor<Object> { |
| 3878 /** | 3878 /** |
| (...skipping 1653 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5532 Expression leftHandSide = node.leftHandSide; | 5532 Expression leftHandSide = node.leftHandSide; |
| 5533 if (leftHandSide != null) { | 5533 if (leftHandSide != null) { |
| 5534 String methodName = operatorType.lexeme; | 5534 String methodName = operatorType.lexeme; |
| 5535 DartType staticType = _getStaticType(leftHandSide); | 5535 DartType staticType = _getStaticType(leftHandSide); |
| 5536 MethodElement staticMethod = _lookUpMethod(leftHandSide, staticType, met
hodName); | 5536 MethodElement staticMethod = _lookUpMethod(leftHandSide, staticType, met
hodName); |
| 5537 node.staticElement = staticMethod; | 5537 node.staticElement = staticMethod; |
| 5538 DartType propagatedType = _getPropagatedType(leftHandSide); | 5538 DartType propagatedType = _getPropagatedType(leftHandSide); |
| 5539 MethodElement propagatedMethod = _lookUpMethod(leftHandSide, propagatedT
ype, methodName); | 5539 MethodElement propagatedMethod = _lookUpMethod(leftHandSide, propagatedT
ype, methodName); |
| 5540 node.propagatedElement = propagatedMethod; | 5540 node.propagatedElement = propagatedMethod; |
| 5541 if (_shouldReportMissingMember(staticType, staticMethod)) { | 5541 if (_shouldReportMissingMember(staticType, staticMethod)) { |
| 5542 _resolver.reportErrorProxyConditionalAnalysisError(staticType.element,
StaticTypeWarningCode.UNDEFINED_METHOD, operator, [methodName, staticType.displ
ayName]); | 5542 _resolver.reportProxyConditionalErrorForToken(staticType.element, Stat
icTypeWarningCode.UNDEFINED_METHOD, operator, [methodName, staticType.displayNam
e]); |
| 5543 } else if (_enableHints && _shouldReportMissingMember(propagatedType, pr
opagatedMethod) && !_memberFoundInSubclass(propagatedType.element, methodName, t
rue, false)) { | 5543 } else if (_enableHints && _shouldReportMissingMember(propagatedType, pr
opagatedMethod) && !_memberFoundInSubclass(propagatedType.element, methodName, t
rue, false)) { |
| 5544 _resolver.reportErrorProxyConditionalAnalysisError(propagatedType.elem
ent, HintCode.UNDEFINED_METHOD, operator, [methodName, propagatedType.displayNam
e]); | 5544 _resolver.reportProxyConditionalErrorForToken(propagatedType.element,
HintCode.UNDEFINED_METHOD, operator, [methodName, propagatedType.displayName]); |
| 5545 } | 5545 } |
| 5546 } | 5546 } |
| 5547 } | 5547 } |
| 5548 return null; | 5548 return null; |
| 5549 } | 5549 } |
| 5550 | 5550 |
| 5551 @override | 5551 @override |
| 5552 Object visitBinaryExpression(BinaryExpression node) { | 5552 Object visitBinaryExpression(BinaryExpression node) { |
| 5553 sc.Token operator = node.operator; | 5553 sc.Token operator = node.operator; |
| 5554 if (operator.isUserDefinableOperator) { | 5554 if (operator.isUserDefinableOperator) { |
| 5555 Expression leftOperand = node.leftOperand; | 5555 Expression leftOperand = node.leftOperand; |
| 5556 if (leftOperand != null) { | 5556 if (leftOperand != null) { |
| 5557 String methodName = operator.lexeme; | 5557 String methodName = operator.lexeme; |
| 5558 DartType staticType = _getStaticType(leftOperand); | 5558 DartType staticType = _getStaticType(leftOperand); |
| 5559 MethodElement staticMethod = _lookUpMethod(leftOperand, staticType, meth
odName); | 5559 MethodElement staticMethod = _lookUpMethod(leftOperand, staticType, meth
odName); |
| 5560 node.staticElement = staticMethod; | 5560 node.staticElement = staticMethod; |
| 5561 DartType propagatedType = _getPropagatedType(leftOperand); | 5561 DartType propagatedType = _getPropagatedType(leftOperand); |
| 5562 MethodElement propagatedMethod = _lookUpMethod(leftOperand, propagatedTy
pe, methodName); | 5562 MethodElement propagatedMethod = _lookUpMethod(leftOperand, propagatedTy
pe, methodName); |
| 5563 node.propagatedElement = propagatedMethod; | 5563 node.propagatedElement = propagatedMethod; |
| 5564 if (_shouldReportMissingMember(staticType, staticMethod)) { | 5564 if (_shouldReportMissingMember(staticType, staticMethod)) { |
| 5565 _resolver.reportErrorProxyConditionalAnalysisError(staticType.element,
StaticTypeWarningCode.UNDEFINED_OPERATOR, operator, [methodName, staticType.dis
playName]); | 5565 _resolver.reportProxyConditionalErrorForToken(staticType.element, Stat
icTypeWarningCode.UNDEFINED_OPERATOR, operator, [methodName, staticType.displayN
ame]); |
| 5566 } else if (_enableHints && _shouldReportMissingMember(propagatedType, pr
opagatedMethod) && !_memberFoundInSubclass(propagatedType.element, methodName, t
rue, false)) { | 5566 } else if (_enableHints && _shouldReportMissingMember(propagatedType, pr
opagatedMethod) && !_memberFoundInSubclass(propagatedType.element, methodName, t
rue, false)) { |
| 5567 _resolver.reportErrorProxyConditionalAnalysisError(propagatedType.elem
ent, HintCode.UNDEFINED_OPERATOR, operator, [methodName, propagatedType.displayN
ame]); | 5567 _resolver.reportProxyConditionalErrorForToken(propagatedType.element,
HintCode.UNDEFINED_OPERATOR, operator, [methodName, propagatedType.displayName])
; |
| 5568 } | 5568 } |
| 5569 } | 5569 } |
| 5570 } | 5570 } |
| 5571 return null; | 5571 return null; |
| 5572 } | 5572 } |
| 5573 | 5573 |
| 5574 @override | 5574 @override |
| 5575 Object visitBreakStatement(BreakStatement node) { | 5575 Object visitBreakStatement(BreakStatement node) { |
| 5576 _lookupLabel(node, node.label); | 5576 _lookupLabel(node, node.label); |
| 5577 return null; | 5577 return null; |
| (...skipping 474 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6052 Object visitPostfixExpression(PostfixExpression node) { | 6052 Object visitPostfixExpression(PostfixExpression node) { |
| 6053 Expression operand = node.operand; | 6053 Expression operand = node.operand; |
| 6054 String methodName = _getPostfixOperator(node); | 6054 String methodName = _getPostfixOperator(node); |
| 6055 DartType staticType = _getStaticType(operand); | 6055 DartType staticType = _getStaticType(operand); |
| 6056 MethodElement staticMethod = _lookUpMethod(operand, staticType, methodName); | 6056 MethodElement staticMethod = _lookUpMethod(operand, staticType, methodName); |
| 6057 node.staticElement = staticMethod; | 6057 node.staticElement = staticMethod; |
| 6058 DartType propagatedType = _getPropagatedType(operand); | 6058 DartType propagatedType = _getPropagatedType(operand); |
| 6059 MethodElement propagatedMethod = _lookUpMethod(operand, propagatedType, meth
odName); | 6059 MethodElement propagatedMethod = _lookUpMethod(operand, propagatedType, meth
odName); |
| 6060 node.propagatedElement = propagatedMethod; | 6060 node.propagatedElement = propagatedMethod; |
| 6061 if (_shouldReportMissingMember(staticType, staticMethod)) { | 6061 if (_shouldReportMissingMember(staticType, staticMethod)) { |
| 6062 _resolver.reportErrorProxyConditionalAnalysisError(staticType.element, Sta
ticTypeWarningCode.UNDEFINED_OPERATOR, node.operator, [methodName, staticType.di
splayName]); | 6062 _resolver.reportProxyConditionalErrorForToken(staticType.element, StaticTy
peWarningCode.UNDEFINED_OPERATOR, node.operator, [methodName, staticType.display
Name]); |
| 6063 } else if (_enableHints && _shouldReportMissingMember(propagatedType, propag
atedMethod) && !_memberFoundInSubclass(propagatedType.element, methodName, true,
false)) { | 6063 } else if (_enableHints && _shouldReportMissingMember(propagatedType, propag
atedMethod) && !_memberFoundInSubclass(propagatedType.element, methodName, true,
false)) { |
| 6064 _resolver.reportErrorProxyConditionalAnalysisError(propagatedType.element,
HintCode.UNDEFINED_OPERATOR, node.operator, [methodName, propagatedType.display
Name]); | 6064 _resolver.reportProxyConditionalErrorForToken(propagatedType.element, Hint
Code.UNDEFINED_OPERATOR, node.operator, [methodName, propagatedType.displayName]
); |
| 6065 } | 6065 } |
| 6066 return null; | 6066 return null; |
| 6067 } | 6067 } |
| 6068 | 6068 |
| 6069 @override | 6069 @override |
| 6070 Object visitPrefixedIdentifier(PrefixedIdentifier node) { | 6070 Object visitPrefixedIdentifier(PrefixedIdentifier node) { |
| 6071 SimpleIdentifier prefix = node.prefix; | 6071 SimpleIdentifier prefix = node.prefix; |
| 6072 SimpleIdentifier identifier = node.identifier; | 6072 SimpleIdentifier identifier = node.identifier; |
| 6073 // | 6073 // |
| 6074 // First, check to see whether the prefix is really a prefix. | 6074 // First, check to see whether the prefix is really a prefix. |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6131 if (operatorType.isUserDefinableOperator || identical(operatorType, sc.Token
Type.PLUS_PLUS) || identical(operatorType, sc.TokenType.MINUS_MINUS)) { | 6131 if (operatorType.isUserDefinableOperator || identical(operatorType, sc.Token
Type.PLUS_PLUS) || identical(operatorType, sc.TokenType.MINUS_MINUS)) { |
| 6132 Expression operand = node.operand; | 6132 Expression operand = node.operand; |
| 6133 String methodName = _getPrefixOperator(node); | 6133 String methodName = _getPrefixOperator(node); |
| 6134 DartType staticType = _getStaticType(operand); | 6134 DartType staticType = _getStaticType(operand); |
| 6135 MethodElement staticMethod = _lookUpMethod(operand, staticType, methodName
); | 6135 MethodElement staticMethod = _lookUpMethod(operand, staticType, methodName
); |
| 6136 node.staticElement = staticMethod; | 6136 node.staticElement = staticMethod; |
| 6137 DartType propagatedType = _getPropagatedType(operand); | 6137 DartType propagatedType = _getPropagatedType(operand); |
| 6138 MethodElement propagatedMethod = _lookUpMethod(operand, propagatedType, me
thodName); | 6138 MethodElement propagatedMethod = _lookUpMethod(operand, propagatedType, me
thodName); |
| 6139 node.propagatedElement = propagatedMethod; | 6139 node.propagatedElement = propagatedMethod; |
| 6140 if (_shouldReportMissingMember(staticType, staticMethod)) { | 6140 if (_shouldReportMissingMember(staticType, staticMethod)) { |
| 6141 _resolver.reportErrorProxyConditionalAnalysisError(staticType.element, S
taticTypeWarningCode.UNDEFINED_OPERATOR, operator, [methodName, staticType.displ
ayName]); | 6141 _resolver.reportProxyConditionalErrorForToken(staticType.element, Static
TypeWarningCode.UNDEFINED_OPERATOR, operator, [methodName, staticType.displayNam
e]); |
| 6142 } else if (_enableHints && _shouldReportMissingMember(propagatedType, prop
agatedMethod) && !_memberFoundInSubclass(propagatedType.element, methodName, tru
e, false)) { | 6142 } else if (_enableHints && _shouldReportMissingMember(propagatedType, prop
agatedMethod) && !_memberFoundInSubclass(propagatedType.element, methodName, tru
e, false)) { |
| 6143 _resolver.reportErrorProxyConditionalAnalysisError(propagatedType.elemen
t, HintCode.UNDEFINED_OPERATOR, operator, [methodName, propagatedType.displayNam
e]); | 6143 _resolver.reportProxyConditionalErrorForToken(propagatedType.element, Hi
ntCode.UNDEFINED_OPERATOR, operator, [methodName, propagatedType.displayName]); |
| 6144 } | 6144 } |
| 6145 } | 6145 } |
| 6146 return null; | 6146 return null; |
| 6147 } | 6147 } |
| 6148 | 6148 |
| 6149 @override | 6149 @override |
| 6150 Object visitPropertyAccess(PropertyAccess node) { | 6150 Object visitPropertyAccess(PropertyAccess node) { |
| 6151 Expression target = node.realTarget; | 6151 Expression target = node.realTarget; |
| 6152 if (target is SuperExpression && !_isSuperInValidContext(target)) { | 6152 if (target is SuperExpression && !_isSuperInValidContext(target)) { |
| 6153 return null; | 6153 return null; |
| (...skipping 2879 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9033 AnalysisErrorListener _errorListener; | 9033 AnalysisErrorListener _errorListener; |
| 9034 | 9034 |
| 9035 /** | 9035 /** |
| 9036 * The name of the function used as an entry point. | 9036 * The name of the function used as an entry point. |
| 9037 */ | 9037 */ |
| 9038 static String ENTRY_POINT_NAME = "main"; | 9038 static String ENTRY_POINT_NAME = "main"; |
| 9039 | 9039 |
| 9040 /** | 9040 /** |
| 9041 * Initialize a newly created library element builder. | 9041 * Initialize a newly created library element builder. |
| 9042 * | 9042 * |
| 9043 * @param resolver the resolver for which the element model is being built | 9043 * @param analysisContext the analysis context in which the element model will
be built |
| 9044 * @param errorListener the listener to which errors will be reported |
| 9044 */ | 9045 */ |
| 9045 LibraryElementBuilder(LibraryResolver resolver) { | 9046 LibraryElementBuilder(InternalAnalysisContext analysisContext, AnalysisErrorLi
stener errorListener) { |
| 9046 this._analysisContext = resolver.analysisContext; | 9047 this._analysisContext = analysisContext; |
| 9047 this._errorListener = resolver.errorListener; | 9048 this._errorListener = errorListener; |
| 9048 } | 9049 } |
| 9049 | 9050 |
| 9050 /** | 9051 /** |
| 9051 * Build the library element for the given library. | 9052 * Build the library element for the given library. |
| 9052 * | 9053 * |
| 9053 * @param library the library for which an element model is to be built | 9054 * @param library the library for which an element model is to be built |
| 9054 * @return the library element that was built | 9055 * @return the library element that was built |
| 9055 * @throws AnalysisException if the analysis could not be performed | 9056 * @throws AnalysisException if the analysis could not be performed |
| 9056 */ | 9057 */ |
| 9057 LibraryElementImpl buildLibrary(Library library) { | 9058 LibraryElementImpl buildLibrary(Library library) { |
| (...skipping 18 matching lines...) Expand all Loading... |
| 9076 if (libraryNameNode == null) { | 9077 if (libraryNameNode == null) { |
| 9077 libraryNameNode = directive.name; | 9078 libraryNameNode = directive.name; |
| 9078 directivesToResolve.add(directive); | 9079 directivesToResolve.add(directive); |
| 9079 } | 9080 } |
| 9080 } else if (directive is PartDirective) { | 9081 } else if (directive is PartDirective) { |
| 9081 PartDirective partDirective = directive; | 9082 PartDirective partDirective = directive; |
| 9082 StringLiteral partUri = partDirective.uri; | 9083 StringLiteral partUri = partDirective.uri; |
| 9083 Source partSource = library.getSource(partDirective); | 9084 Source partSource = library.getSource(partDirective); |
| 9084 if (_analysisContext.exists(partSource)) { | 9085 if (_analysisContext.exists(partSource)) { |
| 9085 hasPartDirective = true; | 9086 hasPartDirective = true; |
| 9086 CompilationUnitElementImpl part = builder.buildCompilationUnit(partSou
rce, library.getAST(partSource)); | 9087 CompilationUnit partUnit = library.getAST(partSource); |
| 9088 CompilationUnitElementImpl part = builder.buildCompilationUnit(partSou
rce, partUnit); |
| 9087 part.uriOffset = partUri.offset; | 9089 part.uriOffset = partUri.offset; |
| 9088 part.uriEnd = partUri.end; | 9090 part.uriEnd = partUri.end; |
| 9089 part.uri = library.getUri(partDirective); | 9091 part.uri = library.getUri(partDirective); |
| 9090 // | 9092 // |
| 9091 // Validate that the part contains a part-of directive with the same n
ame as the library. | 9093 // Validate that the part contains a part-of directive with the same n
ame as the library. |
| 9092 // | 9094 // |
| 9093 String partLibraryName = _getPartLibraryName(library, partSource, dire
ctivesToResolve); | 9095 String partLibraryName = _getPartLibraryName(partSource, partUnit, dir
ectivesToResolve); |
| 9094 if (partLibraryName == null) { | 9096 if (partLibraryName == null) { |
| 9095 _errorListener.onError(new AnalysisError.con2(librarySource, partUri
.offset, partUri.length, CompileTimeErrorCode.PART_OF_NON_PART, [partUri.toSourc
e()])); | 9097 _errorListener.onError(new AnalysisError.con2(librarySource, partUri
.offset, partUri.length, CompileTimeErrorCode.PART_OF_NON_PART, [partUri.toSourc
e()])); |
| 9096 } else if (libraryNameNode == null) { | 9098 } else if (libraryNameNode == null) { |
| 9099 } else if (libraryNameNode.name != partLibraryName) { |
| 9100 _errorListener.onError(new AnalysisError.con2(librarySource, partUri
.offset, partUri.length, StaticWarningCode.PART_OF_DIFFERENT_LIBRARY, [libraryNa
meNode.name, partLibraryName])); |
| 9101 } |
| 9102 if (entryPoint == null) { |
| 9103 entryPoint = _findEntryPoint(part); |
| 9104 } |
| 9105 directive.element = part; |
| 9106 sourcedCompilationUnits.add(part); |
| 9107 } |
| 9108 } |
| 9109 } |
| 9110 if (hasPartDirective && libraryNameNode == null) { |
| 9111 _errorListener.onError(new AnalysisError.con1(librarySource, ResolverError
Code.MISSING_LIBRARY_DIRECTIVE_WITH_PART, [])); |
| 9112 } |
| 9113 // |
| 9114 // Create and populate the library element. |
| 9115 // |
| 9116 LibraryElementImpl libraryElement = new LibraryElementImpl(_analysisContext,
libraryNameNode); |
| 9117 libraryElement.definingCompilationUnit = definingCompilationUnitElement; |
| 9118 if (entryPoint != null) { |
| 9119 libraryElement.entryPoint = entryPoint; |
| 9120 } |
| 9121 int sourcedUnitCount = sourcedCompilationUnits.length; |
| 9122 libraryElement.parts = new List.from(sourcedCompilationUnits); |
| 9123 for (Directive directive in directivesToResolve) { |
| 9124 directive.element = libraryElement; |
| 9125 } |
| 9126 library.libraryElement = libraryElement; |
| 9127 if (sourcedUnitCount > 0) { |
| 9128 _patchTopLevelAccessors(libraryElement); |
| 9129 } |
| 9130 return libraryElement; |
| 9131 } |
| 9132 |
| 9133 /** |
| 9134 * Build the library element for the given library. |
| 9135 * |
| 9136 * @param library the library for which an element model is to be built |
| 9137 * @return the library element that was built |
| 9138 * @throws AnalysisException if the analysis could not be performed |
| 9139 */ |
| 9140 LibraryElementImpl buildLibrary2(ResolvableLibrary library) { |
| 9141 CompilationUnitBuilder builder = new CompilationUnitBuilder(); |
| 9142 Source librarySource = library.librarySource; |
| 9143 CompilationUnit definingCompilationUnit = library.definingCompilationUnit; |
| 9144 CompilationUnitElementImpl definingCompilationUnitElement = builder.buildCom
pilationUnit(librarySource, definingCompilationUnit); |
| 9145 NodeList<Directive> directives = definingCompilationUnit.directives; |
| 9146 LibraryIdentifier libraryNameNode = null; |
| 9147 bool hasPartDirective = false; |
| 9148 FunctionElement entryPoint = _findEntryPoint(definingCompilationUnitElement)
; |
| 9149 List<Directive> directivesToResolve = new List<Directive>(); |
| 9150 List<CompilationUnitElementImpl> sourcedCompilationUnits = new List<Compilat
ionUnitElementImpl>(); |
| 9151 for (Directive directive in directives) { |
| 9152 // |
| 9153 // We do not build the elements representing the import and export directi
ves at this point. |
| 9154 // That is not done until we get to LibraryResolver.buildDirectiveModels()
because we need the |
| 9155 // LibraryElements for the referenced libraries, which might not exist at
this point (due to |
| 9156 // the possibility of circular references). |
| 9157 // |
| 9158 if (directive is LibraryDirective) { |
| 9159 if (libraryNameNode == null) { |
| 9160 libraryNameNode = directive.name; |
| 9161 directivesToResolve.add(directive); |
| 9162 } |
| 9163 } else if (directive is PartDirective) { |
| 9164 PartDirective partDirective = directive; |
| 9165 StringLiteral partUri = partDirective.uri; |
| 9166 Source partSource = partDirective.source; |
| 9167 if (_analysisContext.exists(partSource)) { |
| 9168 hasPartDirective = true; |
| 9169 CompilationUnit partUnit = library.getAST(partSource); |
| 9170 CompilationUnitElementImpl part = builder.buildCompilationUnit(partSou
rce, partUnit); |
| 9171 part.uriOffset = partUri.offset; |
| 9172 part.uriEnd = partUri.end; |
| 9173 part.uri = partDirective.uriContent; |
| 9174 // |
| 9175 // Validate that the part contains a part-of directive with the same n
ame as the library. |
| 9176 // |
| 9177 String partLibraryName = _getPartLibraryName(partSource, partUnit, dir
ectivesToResolve); |
| 9178 if (partLibraryName == null) { |
| 9179 _errorListener.onError(new AnalysisError.con2(librarySource, partUri
.offset, partUri.length, CompileTimeErrorCode.PART_OF_NON_PART, [partUri.toSourc
e()])); |
| 9180 } else if (libraryNameNode == null) { |
| 9097 } else if (libraryNameNode.name != partLibraryName) { | 9181 } else if (libraryNameNode.name != partLibraryName) { |
| 9098 _errorListener.onError(new AnalysisError.con2(librarySource, partUri
.offset, partUri.length, StaticWarningCode.PART_OF_DIFFERENT_LIBRARY, [libraryNa
meNode.name, partLibraryName])); | 9182 _errorListener.onError(new AnalysisError.con2(librarySource, partUri
.offset, partUri.length, StaticWarningCode.PART_OF_DIFFERENT_LIBRARY, [libraryNa
meNode.name, partLibraryName])); |
| 9099 } | 9183 } |
| 9100 if (entryPoint == null) { | 9184 if (entryPoint == null) { |
| 9101 entryPoint = _findEntryPoint(part); | 9185 entryPoint = _findEntryPoint(part); |
| 9102 } | 9186 } |
| 9103 directive.element = part; | 9187 directive.element = part; |
| 9104 sourcedCompilationUnits.add(part); | 9188 sourcedCompilationUnits.add(part); |
| 9105 } | 9189 } |
| 9106 } | 9190 } |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9163 return function; | 9247 return function; |
| 9164 } | 9248 } |
| 9165 } | 9249 } |
| 9166 return null; | 9250 return null; |
| 9167 } | 9251 } |
| 9168 | 9252 |
| 9169 /** | 9253 /** |
| 9170 * Return the name of the library that the given part is declared to be a part
of, or `null` | 9254 * Return the name of the library that the given part is declared to be a part
of, or `null` |
| 9171 * if the part does not contain a part-of directive. | 9255 * if the part does not contain a part-of directive. |
| 9172 * | 9256 * |
| 9173 * @param library the library containing the part | |
| 9174 * @param partSource the source representing the part | 9257 * @param partSource the source representing the part |
| 9258 * @param partUnit the AST structure of the part |
| 9175 * @param directivesToResolve a list of directives that should be resolved to
the library being | 9259 * @param directivesToResolve a list of directives that should be resolved to
the library being |
| 9176 * built | 9260 * built |
| 9177 * @return the name of the library that the given part is declared to be a par
t of | 9261 * @return the name of the library that the given part is declared to be a par
t of |
| 9178 */ | 9262 */ |
| 9179 String _getPartLibraryName(Library library, Source partSource, List<Directive>
directivesToResolve) { | 9263 String _getPartLibraryName(Source partSource, CompilationUnit partUnit, List<D
irective> directivesToResolve) { |
| 9180 try { | 9264 for (Directive directive in partUnit.directives) { |
| 9181 CompilationUnit partUnit = library.getAST(partSource); | 9265 if (directive is PartOfDirective) { |
| 9182 for (Directive directive in partUnit.directives) { | 9266 directivesToResolve.add(directive); |
| 9183 if (directive is PartOfDirective) { | 9267 LibraryIdentifier libraryName = directive.libraryName; |
| 9184 directivesToResolve.add(directive); | 9268 if (libraryName != null) { |
| 9185 LibraryIdentifier libraryName = directive.libraryName; | 9269 return libraryName.name; |
| 9186 if (libraryName != null) { | |
| 9187 return libraryName.name; | |
| 9188 } | |
| 9189 } | 9270 } |
| 9190 } | 9271 } |
| 9191 } on AnalysisException catch (exception) { | |
| 9192 } | 9272 } |
| 9193 return null; | 9273 return null; |
| 9194 } | 9274 } |
| 9195 | 9275 |
| 9196 /** | 9276 /** |
| 9197 * Look through all of the compilation units defined for the given library, lo
oking for getters | 9277 * Look through all of the compilation units defined for the given library, lo
oking for getters |
| 9198 * and setters that are defined in different compilation units but that have t
he same names. If | 9278 * and setters that are defined in different compilation units but that have t
he same names. If |
| 9199 * any are found, make sure that they have the same variable element. | 9279 * any are found, make sure that they have the same variable element. |
| 9200 * | 9280 * |
| 9201 * @param libraryElement the library defining the compilation units to be proc
essed | 9281 * @param libraryElement the library defining the compilation units to be proc
essed |
| (...skipping 443 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9645 } | 9725 } |
| 9646 } | 9726 } |
| 9647 | 9727 |
| 9648 /** | 9728 /** |
| 9649 * Build element models for all of the libraries in the current cycle. | 9729 * Build element models for all of the libraries in the current cycle. |
| 9650 * | 9730 * |
| 9651 * @throws AnalysisException if any of the element models cannot be built | 9731 * @throws AnalysisException if any of the element models cannot be built |
| 9652 */ | 9732 */ |
| 9653 void _buildElementModels() { | 9733 void _buildElementModels() { |
| 9654 for (Library library in _librariesInCycles) { | 9734 for (Library library in _librariesInCycles) { |
| 9655 LibraryElementBuilder builder = new LibraryElementBuilder(this); | 9735 LibraryElementBuilder builder = new LibraryElementBuilder(analysisContext,
errorListener); |
| 9656 LibraryElementImpl libraryElement = builder.buildLibrary(library); | 9736 LibraryElementImpl libraryElement = builder.buildLibrary(library); |
| 9657 library.libraryElement = libraryElement; | 9737 library.libraryElement = libraryElement; |
| 9658 } | 9738 } |
| 9659 } | 9739 } |
| 9660 | 9740 |
| 9661 /** | 9741 /** |
| 9662 * Resolve the type hierarchy across all of the types declared in the librarie
s in the current | 9742 * Resolve the type hierarchy across all of the types declared in the librarie
s in the current |
| 9663 * cycle. | 9743 * cycle. |
| 9664 * | 9744 * |
| 9665 * @throws AnalysisException if any of the type hierarchies could not be resol
ved | 9745 * @throws AnalysisException if any of the type hierarchies could not be resol
ved |
| (...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9942 String uriContent = uriLiteral.stringValue.trim(); | 10022 String uriContent = uriLiteral.stringValue.trim(); |
| 9943 if (uriContent == null || uriContent.isEmpty) { | 10023 if (uriContent == null || uriContent.isEmpty) { |
| 9944 return null; | 10024 return null; |
| 9945 } | 10025 } |
| 9946 uriContent = Uri.encodeFull(uriContent); | 10026 uriContent = Uri.encodeFull(uriContent); |
| 9947 return analysisContext.sourceFactory.resolveUri(librarySource, uriContent); | 10027 return analysisContext.sourceFactory.resolveUri(librarySource, uriContent); |
| 9948 } | 10028 } |
| 9949 } | 10029 } |
| 9950 | 10030 |
| 9951 /** | 10031 /** |
| 10032 * Instances of the class `LibraryResolver` are used to resolve one or more mutu
ally dependent |
| 10033 * libraries within a single context. |
| 10034 */ |
| 10035 class LibraryResolver2 { |
| 10036 /** |
| 10037 * The analysis context in which the libraries are being analyzed. |
| 10038 */ |
| 10039 InternalAnalysisContext analysisContext; |
| 10040 |
| 10041 /** |
| 10042 * The listener to which analysis errors will be reported, this error listener
is either |
| 10043 * references [recordingErrorListener], or it unions the passed |
| 10044 * [AnalysisErrorListener] with the [recordingErrorListener]. |
| 10045 */ |
| 10046 RecordingErrorListener _errorListener; |
| 10047 |
| 10048 /** |
| 10049 * A source object representing the core library (dart:core). |
| 10050 */ |
| 10051 Source _coreLibrarySource; |
| 10052 |
| 10053 /** |
| 10054 * The object representing the core library. |
| 10055 */ |
| 10056 ResolvableLibrary _coreLibrary; |
| 10057 |
| 10058 /** |
| 10059 * The object used to access the types from the core library. |
| 10060 */ |
| 10061 TypeProvider _typeProvider; |
| 10062 |
| 10063 /** |
| 10064 * A table mapping library sources to the information being maintained for tho
se libraries. |
| 10065 */ |
| 10066 Map<Source, ResolvableLibrary> _libraryMap = new Map<Source, ResolvableLibrary
>(); |
| 10067 |
| 10068 /** |
| 10069 * A collection containing the libraries that are being resolved together. |
| 10070 */ |
| 10071 List<ResolvableLibrary> _librariesInCycle; |
| 10072 |
| 10073 /** |
| 10074 * Initialize a newly created library resolver to resolve libraries within the
given context. |
| 10075 * |
| 10076 * @param analysisContext the analysis context in which the library is being a
nalyzed |
| 10077 */ |
| 10078 LibraryResolver2(InternalAnalysisContext analysisContext) { |
| 10079 this.analysisContext = analysisContext; |
| 10080 this._errorListener = new RecordingErrorListener(); |
| 10081 _coreLibrarySource = analysisContext.sourceFactory.forUri(DartSdk.DART_CORE)
; |
| 10082 } |
| 10083 |
| 10084 /** |
| 10085 * Return the listener to which analysis errors will be reported. |
| 10086 * |
| 10087 * @return the listener to which analysis errors will be reported |
| 10088 */ |
| 10089 RecordingErrorListener get errorListener => _errorListener; |
| 10090 |
| 10091 /** |
| 10092 * Return an array containing information about all of the libraries that were
resolved. |
| 10093 * |
| 10094 * @return an array containing the libraries that were resolved |
| 10095 */ |
| 10096 List<ResolvableLibrary> get resolvedLibraries => _librariesInCycle; |
| 10097 |
| 10098 /** |
| 10099 * Resolve the library specified by the given source in the given context. |
| 10100 * |
| 10101 * Note that because Dart allows circular imports between libraries, it is pos
sible that more than |
| 10102 * one library will need to be resolved. In such cases the error listener can
receive errors from |
| 10103 * multiple libraries. |
| 10104 * |
| 10105 * @param librarySource the source specifying the defining compilation unit of
the library to be |
| 10106 * resolved |
| 10107 * @param fullAnalysis `true` if a full analysis should be performed |
| 10108 * @return the element representing the resolved library |
| 10109 * @throws AnalysisException if the library could not be resolved for some rea
son |
| 10110 */ |
| 10111 LibraryElement resolveLibrary(Source librarySource, List<ResolvableLibrary> li
brariesInCycle) { |
| 10112 InstrumentationBuilder instrumentation = Instrumentation.builder2("dart.engi
ne.LibraryResolver.resolveLibrary"); |
| 10113 try { |
| 10114 instrumentation.data3("fullName", librarySource.fullName); |
| 10115 // |
| 10116 // Build the map of libraries that are known. |
| 10117 // |
| 10118 this._librariesInCycle = librariesInCycle; |
| 10119 _libraryMap = _buildLibraryMap(); |
| 10120 ResolvableLibrary targetLibrary = _libraryMap[librarySource]; |
| 10121 _coreLibrary = _libraryMap[_coreLibrarySource]; |
| 10122 instrumentation.metric3("buildLibraryMap", "complete"); |
| 10123 // |
| 10124 // Build the element models representing the libraries being resolved. Thi
s is done in three |
| 10125 // steps: |
| 10126 // |
| 10127 // 1. Build the basic element models without making any connections betwee
n elements other than |
| 10128 // the basic parent/child relationships. This includes building the ele
ments representing the |
| 10129 // libraries. |
| 10130 // 2. Build the elements for the import and export directives. This requir
es that we have the |
| 10131 // elements built for the referenced libraries, but because of the poss
ibility of circular |
| 10132 // references needs to happen after all of the library elements have be
en created. |
| 10133 // 3. Build the rest of the type model by connecting superclasses, mixins,
and interfaces. This |
| 10134 // requires that we be able to compute the names visible in the librari
es being resolved, |
| 10135 // which in turn requires that we have resolved the import directives. |
| 10136 // |
| 10137 _buildElementModels(); |
| 10138 instrumentation.metric3("buildElementModels", "complete"); |
| 10139 LibraryElement coreElement = _coreLibrary.libraryElement; |
| 10140 if (coreElement == null) { |
| 10141 throw new AnalysisException.con1("Could not resolve dart:core"); |
| 10142 } |
| 10143 _buildDirectiveModels(); |
| 10144 instrumentation.metric3("buildDirectiveModels", "complete"); |
| 10145 _typeProvider = new TypeProviderImpl(coreElement); |
| 10146 _buildTypeHierarchies(); |
| 10147 instrumentation.metric3("buildTypeHierarchies", "complete"); |
| 10148 // |
| 10149 // Perform resolution and type analysis. |
| 10150 // |
| 10151 // TODO(brianwilkerson) Decide whether we want to resolve all of the libra
ries or whether we |
| 10152 // want to only resolve the target library. The advantage to resolving eve
rything is that we |
| 10153 // have already done part of the work so we'll avoid duplicated effort. Th
e disadvantage of |
| 10154 // resolving everything is that we might do extra work that we don't reall
y care about. Another |
| 10155 // possibility is to add a parameter to this method and punt the decision
to the clients. |
| 10156 // |
| 10157 //if (analyzeAll) { |
| 10158 _resolveReferencesAndTypes(); |
| 10159 instrumentation.metric3("resolveReferencesAndTypes", "complete"); |
| 10160 //} else { |
| 10161 // resolveReferencesAndTypes(targetLibrary); |
| 10162 //} |
| 10163 _performConstantEvaluation(); |
| 10164 instrumentation.metric3("performConstantEvaluation", "complete"); |
| 10165 instrumentation.metric2("librariesInCycles", librariesInCycle.length); |
| 10166 for (ResolvableLibrary lib in librariesInCycle) { |
| 10167 instrumentation.metric2("librariesInCycles-CompilationUnitSources-Size",
lib.compilationUnitSources.length); |
| 10168 } |
| 10169 return targetLibrary.libraryElement; |
| 10170 } finally { |
| 10171 instrumentation.log(); |
| 10172 } |
| 10173 } |
| 10174 |
| 10175 /** |
| 10176 * Build the element model representing the combinators declared by the given
directive. |
| 10177 * |
| 10178 * @param directive the directive that declares the combinators |
| 10179 * @return an array containing the import combinators that were built |
| 10180 */ |
| 10181 List<NamespaceCombinator> _buildCombinators(NamespaceDirective directive) { |
| 10182 List<NamespaceCombinator> combinators = new List<NamespaceCombinator>(); |
| 10183 for (Combinator combinator in directive.combinators) { |
| 10184 if (combinator is HideCombinator) { |
| 10185 HideElementCombinatorImpl hide = new HideElementCombinatorImpl(); |
| 10186 hide.hiddenNames = _getIdentifiers(combinator.hiddenNames); |
| 10187 combinators.add(hide); |
| 10188 } else { |
| 10189 ShowElementCombinatorImpl show = new ShowElementCombinatorImpl(); |
| 10190 show.offset = combinator.offset; |
| 10191 show.end = combinator.end; |
| 10192 show.shownNames = _getIdentifiers((combinator as ShowCombinator).shownNa
mes); |
| 10193 combinators.add(show); |
| 10194 } |
| 10195 } |
| 10196 return new List.from(combinators); |
| 10197 } |
| 10198 |
| 10199 /** |
| 10200 * Every library now has a corresponding [LibraryElement], so it is now possib
le to resolve |
| 10201 * the import and export directives. |
| 10202 * |
| 10203 * @throws AnalysisException if the defining compilation unit for any of the l
ibraries could not |
| 10204 * be accessed |
| 10205 */ |
| 10206 void _buildDirectiveModels() { |
| 10207 for (ResolvableLibrary library in _librariesInCycle) { |
| 10208 Map<String, PrefixElementImpl> nameToPrefixMap = new Map<String, PrefixEle
mentImpl>(); |
| 10209 List<ImportElement> imports = new List<ImportElement>(); |
| 10210 List<ExportElement> exports = new List<ExportElement>(); |
| 10211 for (Directive directive in library.definingCompilationUnit.directives) { |
| 10212 if (directive is ImportDirective) { |
| 10213 ImportDirective importDirective = directive; |
| 10214 Source importedSource = importDirective.source; |
| 10215 if (importedSource != null && analysisContext.exists(importedSource))
{ |
| 10216 // The imported source will be null if the URI in the import directi
ve was invalid. |
| 10217 ResolvableLibrary importedLibrary = _libraryMap[importedSource]; |
| 10218 if (importedLibrary != null) { |
| 10219 ImportElementImpl importElement = new ImportElementImpl(directive.
offset); |
| 10220 StringLiteral uriLiteral = importDirective.uri; |
| 10221 if (uriLiteral != null) { |
| 10222 importElement.uriOffset = uriLiteral.offset; |
| 10223 importElement.uriEnd = uriLiteral.end; |
| 10224 } |
| 10225 importElement.uri = importDirective.uriContent; |
| 10226 importElement.combinators = _buildCombinators(importDirective); |
| 10227 LibraryElement importedLibraryElement = importedLibrary.libraryEle
ment; |
| 10228 if (importedLibraryElement != null) { |
| 10229 importElement.importedLibrary = importedLibraryElement; |
| 10230 } |
| 10231 SimpleIdentifier prefixNode = directive.prefix; |
| 10232 if (prefixNode != null) { |
| 10233 importElement.prefixOffset = prefixNode.offset; |
| 10234 String prefixName = prefixNode.name; |
| 10235 PrefixElementImpl prefix = nameToPrefixMap[prefixName]; |
| 10236 if (prefix == null) { |
| 10237 prefix = new PrefixElementImpl(prefixNode); |
| 10238 nameToPrefixMap[prefixName] = prefix; |
| 10239 } |
| 10240 importElement.prefix = prefix; |
| 10241 prefixNode.staticElement = prefix; |
| 10242 } |
| 10243 directive.element = importElement; |
| 10244 imports.add(importElement); |
| 10245 if (analysisContext.computeKindOf(importedSource) != SourceKind.LI
BRARY) { |
| 10246 _errorListener.onError(new AnalysisError.con2(library.librarySou
rce, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.IMPORT_OF_NON_LI
BRARY, [uriLiteral.toSource()])); |
| 10247 } |
| 10248 } |
| 10249 } |
| 10250 } else if (directive is ExportDirective) { |
| 10251 ExportDirective exportDirective = directive; |
| 10252 Source exportedSource = exportDirective.source; |
| 10253 if (exportedSource != null && analysisContext.exists(exportedSource))
{ |
| 10254 // The exported source will be null if the URI in the export directi
ve was invalid. |
| 10255 ResolvableLibrary exportedLibrary = _libraryMap[exportedSource]; |
| 10256 if (exportedLibrary != null) { |
| 10257 ExportElementImpl exportElement = new ExportElementImpl(); |
| 10258 StringLiteral uriLiteral = exportDirective.uri; |
| 10259 if (uriLiteral != null) { |
| 10260 exportElement.uriOffset = uriLiteral.offset; |
| 10261 exportElement.uriEnd = uriLiteral.end; |
| 10262 } |
| 10263 exportElement.uri = exportDirective.uriContent; |
| 10264 exportElement.combinators = _buildCombinators(exportDirective); |
| 10265 LibraryElement exportedLibraryElement = exportedLibrary.libraryEle
ment; |
| 10266 if (exportedLibraryElement != null) { |
| 10267 exportElement.exportedLibrary = exportedLibraryElement; |
| 10268 } |
| 10269 directive.element = exportElement; |
| 10270 exports.add(exportElement); |
| 10271 if (analysisContext.computeKindOf(exportedSource) != SourceKind.LI
BRARY) { |
| 10272 _errorListener.onError(new AnalysisError.con2(library.librarySou
rce, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.EXPORT_OF_NON_LI
BRARY, [uriLiteral.toSource()])); |
| 10273 } |
| 10274 } |
| 10275 } |
| 10276 } |
| 10277 } |
| 10278 Source librarySource = library.librarySource; |
| 10279 if (!library.explicitlyImportsCore && _coreLibrarySource != librarySource)
{ |
| 10280 ImportElementImpl importElement = new ImportElementImpl(-1); |
| 10281 importElement.importedLibrary = _coreLibrary.libraryElement; |
| 10282 importElement.synthetic = true; |
| 10283 imports.add(importElement); |
| 10284 } |
| 10285 LibraryElementImpl libraryElement = library.libraryElement; |
| 10286 libraryElement.imports = new List.from(imports); |
| 10287 libraryElement.exports = new List.from(exports); |
| 10288 if (libraryElement.entryPoint == null) { |
| 10289 Namespace namespace = new NamespaceBuilder().createExportNamespaceForLib
rary(libraryElement); |
| 10290 Element element = namespace.get(LibraryElementBuilder.ENTRY_POINT_NAME); |
| 10291 if (element is FunctionElement) { |
| 10292 libraryElement.entryPoint = element; |
| 10293 } |
| 10294 } |
| 10295 } |
| 10296 } |
| 10297 |
| 10298 /** |
| 10299 * Build element models for all of the libraries in the current cycle. |
| 10300 * |
| 10301 * @throws AnalysisException if any of the element models cannot be built |
| 10302 */ |
| 10303 void _buildElementModels() { |
| 10304 for (ResolvableLibrary library in _librariesInCycle) { |
| 10305 LibraryElementBuilder builder = new LibraryElementBuilder(analysisContext,
errorListener); |
| 10306 LibraryElementImpl libraryElement = builder.buildLibrary2(library); |
| 10307 library.libraryElement = libraryElement; |
| 10308 } |
| 10309 } |
| 10310 |
| 10311 Map<Source, ResolvableLibrary> _buildLibraryMap() { |
| 10312 Map<Source, ResolvableLibrary> libraryMap = new Map<Source, ResolvableLibrar
y>(); |
| 10313 int libraryCount = _librariesInCycle.length; |
| 10314 for (int i = 0; i < libraryCount; i++) { |
| 10315 ResolvableLibrary library = _librariesInCycle[i]; |
| 10316 library.errorListener = _errorListener; |
| 10317 libraryMap[library.librarySource] = library; |
| 10318 List<ResolvableLibrary> dependencies = library.importsAndExports; |
| 10319 int dependencyCount = dependencies.length; |
| 10320 for (int j = 0; j < dependencyCount; j++) { |
| 10321 ResolvableLibrary dependency = dependencies[j]; |
| 10322 //dependency.setErrorListener(errorListener); |
| 10323 libraryMap[dependency.librarySource] = dependency; |
| 10324 } |
| 10325 } |
| 10326 return libraryMap; |
| 10327 } |
| 10328 |
| 10329 /** |
| 10330 * Resolve the type hierarchy across all of the types declared in the librarie
s in the current |
| 10331 * cycle. |
| 10332 * |
| 10333 * @throws AnalysisException if any of the type hierarchies could not be resol
ved |
| 10334 */ |
| 10335 void _buildTypeHierarchies() { |
| 10336 TimeCounter_TimeCounterHandle timeCounter = PerformanceStatistics.resolve.st
art(); |
| 10337 try { |
| 10338 for (ResolvableLibrary library in _librariesInCycle) { |
| 10339 for (ResolvableCompilationUnit unit in library.resolvableCompilationUnit
s) { |
| 10340 Source source = unit.source; |
| 10341 CompilationUnit ast = unit.compilationUnit; |
| 10342 TypeResolverVisitor visitor = new TypeResolverVisitor.con4(library, so
urce, _typeProvider); |
| 10343 ast.accept(visitor); |
| 10344 } |
| 10345 } |
| 10346 } finally { |
| 10347 timeCounter.stop(); |
| 10348 } |
| 10349 } |
| 10350 |
| 10351 /** |
| 10352 * Return an array containing the lexical identifiers associated with the node
s in the given list. |
| 10353 * |
| 10354 * @param names the AST nodes representing the identifiers |
| 10355 * @return the lexical identifiers associated with the nodes in the list |
| 10356 */ |
| 10357 List<String> _getIdentifiers(NodeList<SimpleIdentifier> names) { |
| 10358 int count = names.length; |
| 10359 List<String> identifiers = new List<String>(count); |
| 10360 for (int i = 0; i < count; i++) { |
| 10361 identifiers[i] = names[i].name; |
| 10362 } |
| 10363 return identifiers; |
| 10364 } |
| 10365 |
| 10366 /** |
| 10367 * Compute a value for all of the constants in the libraries being analyzed. |
| 10368 */ |
| 10369 void _performConstantEvaluation() { |
| 10370 TimeCounter_TimeCounterHandle timeCounter = PerformanceStatistics.resolve.st
art(); |
| 10371 try { |
| 10372 ConstantValueComputer computer = new ConstantValueComputer(_typeProvider); |
| 10373 for (ResolvableLibrary library in _librariesInCycle) { |
| 10374 for (ResolvableCompilationUnit unit in library.resolvableCompilationUnit
s) { |
| 10375 CompilationUnit ast = unit.compilationUnit; |
| 10376 if (ast != null) { |
| 10377 computer.add(ast); |
| 10378 } |
| 10379 } |
| 10380 } |
| 10381 computer.computeValues(); |
| 10382 } finally { |
| 10383 timeCounter.stop(); |
| 10384 } |
| 10385 } |
| 10386 |
| 10387 /** |
| 10388 * Resolve the identifiers and perform type analysis in the libraries in the c
urrent cycle. |
| 10389 * |
| 10390 * @throws AnalysisException if any of the identifiers could not be resolved o
r if any of the |
| 10391 * libraries could not have their types analyzed |
| 10392 */ |
| 10393 void _resolveReferencesAndTypes() { |
| 10394 for (ResolvableLibrary library in _librariesInCycle) { |
| 10395 _resolveReferencesAndTypesInLibrary(library); |
| 10396 } |
| 10397 } |
| 10398 |
| 10399 /** |
| 10400 * Resolve the identifiers and perform type analysis in the given library. |
| 10401 * |
| 10402 * @param library the library to be resolved |
| 10403 * @throws AnalysisException if any of the identifiers could not be resolved o
r if the types in |
| 10404 * the library cannot be analyzed |
| 10405 */ |
| 10406 void _resolveReferencesAndTypesInLibrary(ResolvableLibrary library) { |
| 10407 TimeCounter_TimeCounterHandle timeCounter = PerformanceStatistics.resolve.st
art(); |
| 10408 try { |
| 10409 for (ResolvableCompilationUnit unit in library.resolvableCompilationUnits)
{ |
| 10410 Source source = unit.source; |
| 10411 CompilationUnit ast = unit.compilationUnit; |
| 10412 ast.accept(new VariableResolverVisitor.con3(library, source, _typeProvid
er)); |
| 10413 ResolverVisitor visitor = new ResolverVisitor.con4(library, source, _typ
eProvider); |
| 10414 ast.accept(visitor); |
| 10415 for (ProxyConditionalAnalysisError conditionalCode in visitor.proxyCondi
tionalAnalysisErrors) { |
| 10416 if (conditionalCode.shouldIncludeErrorCode()) { |
| 10417 visitor.reportError(conditionalCode.analysisError); |
| 10418 } |
| 10419 } |
| 10420 } |
| 10421 } finally { |
| 10422 timeCounter.stop(); |
| 10423 } |
| 10424 // Angular |
| 10425 timeCounter = PerformanceStatistics.angular.start(); |
| 10426 try { |
| 10427 for (ResolvableCompilationUnit unit in library.resolvableCompilationUnits)
{ |
| 10428 Source source = unit.source; |
| 10429 CompilationUnit ast = unit.compilationUnit; |
| 10430 new AngularCompilationUnitBuilder(_errorListener, source, ast).build(); |
| 10431 } |
| 10432 } finally { |
| 10433 timeCounter.stop(); |
| 10434 } |
| 10435 } |
| 10436 } |
| 10437 |
| 10438 /** |
| 9952 * This class is used to replace uses of `HashMap<String, ExecutableElement>` wh
ich are not as | 10439 * This class is used to replace uses of `HashMap<String, ExecutableElement>` wh
ich are not as |
| 9953 * performant as this class. | 10440 * performant as this class. |
| 9954 */ | 10441 */ |
| 9955 class MemberMap { | 10442 class MemberMap { |
| 9956 /** | 10443 /** |
| 9957 * The current size of this map. | 10444 * The current size of this map. |
| 9958 */ | 10445 */ |
| 9959 int _size = 0; | 10446 int _size = 0; |
| 9960 | 10447 |
| 9961 /** | 10448 /** |
| (...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10151 */ | 10638 */ |
| 10152 bool shouldIncludeErrorCode() { | 10639 bool shouldIncludeErrorCode() { |
| 10153 if (_enclosingElement is ClassElement) { | 10640 if (_enclosingElement is ClassElement) { |
| 10154 return !(_enclosingElement as ClassElement).isOrInheritsProxy; | 10641 return !(_enclosingElement as ClassElement).isOrInheritsProxy; |
| 10155 } | 10642 } |
| 10156 return true; | 10643 return true; |
| 10157 } | 10644 } |
| 10158 } | 10645 } |
| 10159 | 10646 |
| 10160 /** | 10647 /** |
| 10648 * Instances of the class `Library` represent the data about a single library du
ring the |
| 10649 * resolution of some (possibly different) library. They are not intended to be
used except during |
| 10650 * the resolution process. |
| 10651 */ |
| 10652 class ResolvableLibrary { |
| 10653 /** |
| 10654 * The source specifying the defining compilation unit of this library. |
| 10655 */ |
| 10656 Source librarySource; |
| 10657 |
| 10658 /** |
| 10659 * A list containing all of the libraries that are imported into this library. |
| 10660 */ |
| 10661 List<ResolvableLibrary> _importedLibraries = _EMPTY_ARRAY; |
| 10662 |
| 10663 /** |
| 10664 * A flag indicating whether this library explicitly imports core. |
| 10665 */ |
| 10666 bool explicitlyImportsCore = false; |
| 10667 |
| 10668 /** |
| 10669 * An array containing all of the libraries that are exported from this librar
y. |
| 10670 */ |
| 10671 List<ResolvableLibrary> _exportedLibraries = _EMPTY_ARRAY; |
| 10672 |
| 10673 /** |
| 10674 * An array containing the compilation units that comprise this library. The d
efining compilation |
| 10675 * unit is always first. |
| 10676 */ |
| 10677 List<ResolvableCompilationUnit> _compilationUnits; |
| 10678 |
| 10679 /** |
| 10680 * The library element representing this library. |
| 10681 */ |
| 10682 LibraryElementImpl _libraryElement; |
| 10683 |
| 10684 /** |
| 10685 * The listener to which analysis errors will be reported. |
| 10686 */ |
| 10687 AnalysisErrorListener _errorListener; |
| 10688 |
| 10689 /** |
| 10690 * The inheritance manager which is used for member lookups in this library. |
| 10691 */ |
| 10692 InheritanceManager _inheritanceManager; |
| 10693 |
| 10694 /** |
| 10695 * An empty array that can be used to initialize lists of libraries. |
| 10696 */ |
| 10697 static List<ResolvableLibrary> _EMPTY_ARRAY = new List<ResolvableLibrary>(0); |
| 10698 |
| 10699 /** |
| 10700 * The library scope used when resolving elements within this library's compil
ation units. |
| 10701 */ |
| 10702 LibraryScope _libraryScope; |
| 10703 |
| 10704 /** |
| 10705 * Initialize a newly created data holder that can maintain the data associate
d with a library. |
| 10706 * |
| 10707 * @param librarySource the source specifying the defining compilation unit of
this library |
| 10708 * @param errorListener the listener to which analysis errors will be reported |
| 10709 */ |
| 10710 ResolvableLibrary(Source librarySource) { |
| 10711 this.librarySource = librarySource; |
| 10712 } |
| 10713 |
| 10714 /** |
| 10715 * Return the AST structure associated with the given source, or `null` if the
source does |
| 10716 * not represent a compilation unit that is included in this library. |
| 10717 * |
| 10718 * @param source the source representing the compilation unit whose AST is to
be returned |
| 10719 * @return the AST structure associated with the given source |
| 10720 * @throws AnalysisException if an AST structure could not be created for the
compilation unit |
| 10721 */ |
| 10722 CompilationUnit getAST(Source source) { |
| 10723 int count = _compilationUnits.length; |
| 10724 for (int i = 0; i < count; i++) { |
| 10725 if (_compilationUnits[i].source == source) { |
| 10726 return _compilationUnits[i].compilationUnit; |
| 10727 } |
| 10728 } |
| 10729 return null; |
| 10730 } |
| 10731 |
| 10732 /** |
| 10733 * Return an array of the [CompilationUnit]s that make up the library. The fir
st unit is |
| 10734 * always the defining unit. |
| 10735 * |
| 10736 * @return an array of the [CompilationUnit]s that make up the library. The fi
rst unit is |
| 10737 * always the defining unit |
| 10738 */ |
| 10739 List<CompilationUnit> get compilationUnits { |
| 10740 int count = _compilationUnits.length; |
| 10741 List<CompilationUnit> units = new List<CompilationUnit>(count); |
| 10742 for (int i = 0; i < count; i++) { |
| 10743 units[i] = _compilationUnits[i].compilationUnit; |
| 10744 } |
| 10745 return units; |
| 10746 } |
| 10747 |
| 10748 /** |
| 10749 * Return an array containing the sources for the compilation units in this li
brary, including the |
| 10750 * defining compilation unit. |
| 10751 * |
| 10752 * @return the sources for the compilation units in this library |
| 10753 */ |
| 10754 List<Source> get compilationUnitSources { |
| 10755 int count = _compilationUnits.length; |
| 10756 List<Source> sources = new List<Source>(count); |
| 10757 for (int i = 0; i < count; i++) { |
| 10758 sources[i] = _compilationUnits[i].source; |
| 10759 } |
| 10760 return sources; |
| 10761 } |
| 10762 |
| 10763 /** |
| 10764 * Return the AST structure associated with the defining compilation unit for
this library. |
| 10765 * |
| 10766 * @return the AST structure associated with the defining compilation unit for
this library |
| 10767 * @throws AnalysisException if an AST structure could not be created for the
defining compilation |
| 10768 * unit |
| 10769 */ |
| 10770 CompilationUnit get definingCompilationUnit => _compilationUnits[0].compilatio
nUnit; |
| 10771 |
| 10772 /** |
| 10773 * Return an array containing the libraries that are exported from this librar
y. |
| 10774 * |
| 10775 * @return an array containing the libraries that are exported from this libra
ry |
| 10776 */ |
| 10777 List<ResolvableLibrary> get exports => _exportedLibraries; |
| 10778 |
| 10779 /** |
| 10780 * Return an array containing the libraries that are imported into this librar
y. |
| 10781 * |
| 10782 * @return an array containing the libraries that are imported into this libra
ry |
| 10783 */ |
| 10784 List<ResolvableLibrary> get imports => _importedLibraries; |
| 10785 |
| 10786 /** |
| 10787 * Return an array containing the libraries that are either imported or export
ed from this |
| 10788 * library. |
| 10789 * |
| 10790 * @return the libraries that are either imported or exported from this librar
y |
| 10791 */ |
| 10792 List<ResolvableLibrary> get importsAndExports { |
| 10793 Set<ResolvableLibrary> libraries = new Set<ResolvableLibrary>(); |
| 10794 for (ResolvableLibrary library in _importedLibraries) { |
| 10795 libraries.add(library); |
| 10796 } |
| 10797 for (ResolvableLibrary library in _exportedLibraries) { |
| 10798 libraries.add(library); |
| 10799 } |
| 10800 return new List.from(libraries); |
| 10801 } |
| 10802 |
| 10803 /** |
| 10804 * Return the inheritance manager for this library. |
| 10805 * |
| 10806 * @return the inheritance manager for this library |
| 10807 */ |
| 10808 InheritanceManager get inheritanceManager { |
| 10809 if (_inheritanceManager == null) { |
| 10810 return _inheritanceManager = new InheritanceManager(_libraryElement); |
| 10811 } |
| 10812 return _inheritanceManager; |
| 10813 } |
| 10814 |
| 10815 /** |
| 10816 * Return the library element representing this library, creating it if necess
ary. |
| 10817 * |
| 10818 * @return the library element representing this library |
| 10819 */ |
| 10820 LibraryElementImpl get libraryElement => _libraryElement; |
| 10821 |
| 10822 /** |
| 10823 * Return the library scope used when resolving elements within this library's
compilation units. |
| 10824 * |
| 10825 * @return the library scope used when resolving elements within this library'
s compilation units |
| 10826 */ |
| 10827 LibraryScope get libraryScope { |
| 10828 if (_libraryScope == null) { |
| 10829 _libraryScope = new LibraryScope(_libraryElement, _errorListener); |
| 10830 } |
| 10831 return _libraryScope; |
| 10832 } |
| 10833 |
| 10834 /** |
| 10835 * Return the modification time associated with the given source. |
| 10836 * |
| 10837 * @param source the source representing the compilation unit whose modificati
on time is to be |
| 10838 * returned |
| 10839 * @return the modification time associated with the given source |
| 10840 * @throws AnalysisException if an AST structure could not be created for the
compilation unit |
| 10841 */ |
| 10842 int getModificationTime(Source source) { |
| 10843 int count = _compilationUnits.length; |
| 10844 for (int i = 0; i < count; i++) { |
| 10845 if (source == _compilationUnits[i].source) { |
| 10846 return _compilationUnits[i].modificationTime; |
| 10847 } |
| 10848 } |
| 10849 return -1; |
| 10850 } |
| 10851 |
| 10852 /** |
| 10853 * Return an array containing the compilation units that comprise this library
. The defining |
| 10854 * compilation unit is always first. |
| 10855 * |
| 10856 * @return the compilation units that comprise this library |
| 10857 */ |
| 10858 List<ResolvableCompilationUnit> get resolvableCompilationUnits => _compilation
Units; |
| 10859 |
| 10860 /** |
| 10861 * Set the compilation unit in this library to the given compilation units. Th
e defining |
| 10862 * compilation unit must be the first element of the array. |
| 10863 * |
| 10864 * @param units the compilation units in this library |
| 10865 */ |
| 10866 void set resolvableCompilationUnits(List<ResolvableCompilationUnit> units) { |
| 10867 _compilationUnits = units; |
| 10868 } |
| 10869 |
| 10870 /** |
| 10871 * Set the listener to which analysis errors will be reported to be the given
listener. |
| 10872 * |
| 10873 * @param errorListener the listener to which analysis errors will be reported |
| 10874 */ |
| 10875 void set errorListener(AnalysisErrorListener errorListener) { |
| 10876 this._errorListener = errorListener; |
| 10877 } |
| 10878 |
| 10879 /** |
| 10880 * Set the libraries that are exported by this library to be those in the give
n array. |
| 10881 * |
| 10882 * @param exportedLibraries the libraries that are exported by this library |
| 10883 */ |
| 10884 void set exportedLibraries(List<ResolvableLibrary> exportedLibraries) { |
| 10885 this._exportedLibraries = exportedLibraries; |
| 10886 } |
| 10887 |
| 10888 /** |
| 10889 * Set the libraries that are imported into this library to be those in the gi
ven array. |
| 10890 * |
| 10891 * @param importedLibraries the libraries that are imported into this library |
| 10892 */ |
| 10893 void set importedLibraries(List<ResolvableLibrary> importedLibraries) { |
| 10894 this._importedLibraries = importedLibraries; |
| 10895 } |
| 10896 |
| 10897 /** |
| 10898 * Set the library element representing this library to the given library elem
ent. |
| 10899 * |
| 10900 * @param libraryElement the library element representing this library |
| 10901 */ |
| 10902 void set libraryElement(LibraryElementImpl libraryElement) { |
| 10903 this._libraryElement = libraryElement; |
| 10904 if (_inheritanceManager != null) { |
| 10905 _inheritanceManager.libraryElement = libraryElement; |
| 10906 } |
| 10907 } |
| 10908 |
| 10909 @override |
| 10910 String toString() => librarySource.shortName; |
| 10911 } |
| 10912 |
| 10913 /** |
| 10161 * Instances of the class `ResolverVisitor` are used to resolve the nodes within
a single | 10914 * Instances of the class `ResolverVisitor` are used to resolve the nodes within
a single |
| 10162 * compilation unit. | 10915 * compilation unit. |
| 10163 */ | 10916 */ |
| 10164 class ResolverVisitor extends ScopedVisitor { | 10917 class ResolverVisitor extends ScopedVisitor { |
| 10165 /** | 10918 /** |
| 10166 * The manager for the inheritance mappings. | 10919 * The manager for the inheritance mappings. |
| 10167 */ | 10920 */ |
| 10168 InheritanceManager _inheritanceManager; | 10921 InheritanceManager _inheritanceManager; |
| 10169 | 10922 |
| 10170 /** | 10923 /** |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10249 * @param errorListener the error listener that will be informed of any errors
that are found | 11002 * @param errorListener the error listener that will be informed of any errors
that are found |
| 10250 * during resolution | 11003 * during resolution |
| 10251 */ | 11004 */ |
| 10252 ResolverVisitor.con3(LibraryElement definingLibrary, Source source, TypeProvid
er typeProvider, Scope nameScope, AnalysisErrorListener errorListener) : super.c
on3(definingLibrary, source, typeProvider, nameScope, errorListener) { | 11005 ResolverVisitor.con3(LibraryElement definingLibrary, Source source, TypeProvid
er typeProvider, Scope nameScope, AnalysisErrorListener errorListener) : super.c
on3(definingLibrary, source, typeProvider, nameScope, errorListener) { |
| 10253 this._inheritanceManager = new InheritanceManager(definingLibrary); | 11006 this._inheritanceManager = new InheritanceManager(definingLibrary); |
| 10254 this._elementResolver = new ElementResolver(this); | 11007 this._elementResolver = new ElementResolver(this); |
| 10255 this._typeAnalyzer = new StaticTypeAnalyzer(this); | 11008 this._typeAnalyzer = new StaticTypeAnalyzer(this); |
| 10256 } | 11009 } |
| 10257 | 11010 |
| 10258 /** | 11011 /** |
| 11012 * Initialize a newly created visitor to resolve the nodes in a compilation un
it. |
| 11013 * |
| 11014 * @param library the library containing the compilation unit being resolved |
| 11015 * @param source the source representing the compilation unit being visited |
| 11016 * @param typeProvider the object used to access the types from the core libra
ry |
| 11017 */ |
| 11018 ResolverVisitor.con4(ResolvableLibrary library, Source source, TypeProvider ty
peProvider) : super.con4(library, source, typeProvider) { |
| 11019 this._inheritanceManager = library.inheritanceManager; |
| 11020 this._elementResolver = new ElementResolver(this); |
| 11021 this._typeAnalyzer = new StaticTypeAnalyzer(this); |
| 11022 } |
| 11023 |
| 11024 /** |
| 10259 * Return the object keeping track of which elements have had their types over
ridden. | 11025 * Return the object keeping track of which elements have had their types over
ridden. |
| 10260 * | 11026 * |
| 10261 * @return the object keeping track of which elements have had their types ove
rridden | 11027 * @return the object keeping track of which elements have had their types ove
rridden |
| 10262 */ | 11028 */ |
| 10263 TypeOverrideManager get overrideManager => _overrideManager; | 11029 TypeOverrideManager get overrideManager => _overrideManager; |
| 10264 | 11030 |
| 10265 /** | 11031 /** |
| 10266 * Return the object keeping track of which elements have had their types prom
oted. | 11032 * Return the object keeping track of which elements have had their types prom
oted. |
| 10267 * | 11033 * |
| 10268 * @return the object keeping track of which elements have had their types pro
moted | 11034 * @return the object keeping track of which elements have had their types pro
moted |
| (...skipping 716 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10985 } | 11751 } |
| 10986 | 11752 |
| 10987 /** | 11753 /** |
| 10988 * Report a conditional analysis error with the given error code and arguments
. | 11754 * Report a conditional analysis error with the given error code and arguments
. |
| 10989 * | 11755 * |
| 10990 * @param enclosingElement the enclosing element | 11756 * @param enclosingElement the enclosing element |
| 10991 * @param errorCode the error code of the error to be reported | 11757 * @param errorCode the error code of the error to be reported |
| 10992 * @param token the token specifying the location of the error | 11758 * @param token the token specifying the location of the error |
| 10993 * @param arguments the arguments to the error, used to compose the error mess
age | 11759 * @param arguments the arguments to the error, used to compose the error mess
age |
| 10994 */ | 11760 */ |
| 10995 void reportErrorProxyConditionalAnalysisError(Element enclosingElement, ErrorC
ode errorCode, sc.Token token, List<Object> arguments) { | 11761 void reportProxyConditionalErrorForToken(Element enclosingElement, ErrorCode e
rrorCode, sc.Token token, List<Object> arguments) { |
| 10996 _proxyConditionalAnalysisErrors.add(new ProxyConditionalAnalysisError(enclos
ingElement, new AnalysisError.con2(source, token.offset, token.length, errorCode
, arguments))); | 11762 _proxyConditionalAnalysisErrors.add(new ProxyConditionalAnalysisError(enclos
ingElement, new AnalysisError.con2(source, token.offset, token.length, errorCode
, arguments))); |
| 10997 } | 11763 } |
| 10998 | 11764 |
| 10999 @override | 11765 @override |
| 11000 void visitForEachStatementInScope(ForEachStatement node) { | 11766 void visitForEachStatementInScope(ForEachStatement node) { |
| 11001 // | 11767 // |
| 11002 // We visit the iterator before the loop variable because the loop variable
cannot be in scope | 11768 // We visit the iterator before the loop variable because the loop variable
cannot be in scope |
| 11003 // while visiting the iterator. | 11769 // while visiting the iterator. |
| 11004 // | 11770 // |
| 11005 Expression iterator = node.iterator; | 11771 Expression iterator = node.iterator; |
| (...skipping 540 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 11546 */ | 12312 */ |
| 11547 ScopedVisitor.con3(LibraryElement definingLibrary, Source source, TypeProvider
typeProvider, Scope nameScope, AnalysisErrorListener errorListener) { | 12313 ScopedVisitor.con3(LibraryElement definingLibrary, Source source, TypeProvider
typeProvider, Scope nameScope, AnalysisErrorListener errorListener) { |
| 11548 this._definingLibrary = definingLibrary; | 12314 this._definingLibrary = definingLibrary; |
| 11549 this.source = source; | 12315 this.source = source; |
| 11550 this._errorListener = errorListener; | 12316 this._errorListener = errorListener; |
| 11551 this._nameScope = nameScope; | 12317 this._nameScope = nameScope; |
| 11552 this.typeProvider = typeProvider; | 12318 this.typeProvider = typeProvider; |
| 11553 } | 12319 } |
| 11554 | 12320 |
| 11555 /** | 12321 /** |
| 12322 * Initialize a newly created visitor to resolve the nodes in a compilation un
it. |
| 12323 * |
| 12324 * @param library the library containing the compilation unit being resolved |
| 12325 * @param source the source representing the compilation unit being visited |
| 12326 * @param typeProvider the object used to access the types from the core libra
ry |
| 12327 */ |
| 12328 ScopedVisitor.con4(ResolvableLibrary library, Source source, TypeProvider type
Provider) { |
| 12329 this._definingLibrary = library.libraryElement; |
| 12330 this.source = source; |
| 12331 LibraryScope libraryScope = library.libraryScope; |
| 12332 this._errorListener = libraryScope.errorListener; |
| 12333 this._nameScope = libraryScope; |
| 12334 this.typeProvider = typeProvider; |
| 12335 } |
| 12336 |
| 12337 /** |
| 11556 * Return the library element for the library containing the compilation unit
being resolved. | 12338 * Return the library element for the library containing the compilation unit
being resolved. |
| 11557 * | 12339 * |
| 11558 * @return the library element for the library containing the compilation unit
being resolved | 12340 * @return the library element for the library containing the compilation unit
being resolved |
| 11559 */ | 12341 */ |
| 11560 LibraryElement get definingLibrary => _definingLibrary; | 12342 LibraryElement get definingLibrary => _definingLibrary; |
| 11561 | 12343 |
| 11562 /** | 12344 /** |
| 11563 * Replaces the current [Scope] with the enclosing [Scope]. | 12345 * Replaces the current [Scope] with the enclosing [Scope]. |
| 11564 * | 12346 * |
| 11565 * @return the enclosing [Scope]. | 12347 * @return the enclosing [Scope]. |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 11620 _nameScope = outerScope; | 12402 _nameScope = outerScope; |
| 11621 } | 12403 } |
| 11622 } else { | 12404 } else { |
| 11623 super.visitCatchClause(node); | 12405 super.visitCatchClause(node); |
| 11624 } | 12406 } |
| 11625 return null; | 12407 return null; |
| 11626 } | 12408 } |
| 11627 | 12409 |
| 11628 @override | 12410 @override |
| 11629 Object visitClassDeclaration(ClassDeclaration node) { | 12411 Object visitClassDeclaration(ClassDeclaration node) { |
| 12412 ClassElement classElement = node.element; |
| 11630 Scope outerScope = _nameScope; | 12413 Scope outerScope = _nameScope; |
| 11631 try { | 12414 try { |
| 11632 _nameScope = new ClassScope(_nameScope, node.element); | 12415 if (classElement == null) { |
| 12416 AnalysisEngine.instance.logger.logInformation2("Missing element for cons
tructor ${node.name.name} in ${definingLibrary.source.fullName}", new JavaExcept
ion()); |
| 12417 } else { |
| 12418 _nameScope = new ClassScope(_nameScope, classElement); |
| 12419 } |
| 11633 visitClassDeclarationInScope(node); | 12420 visitClassDeclarationInScope(node); |
| 11634 } finally { | 12421 } finally { |
| 11635 _nameScope = outerScope; | 12422 _nameScope = outerScope; |
| 11636 } | 12423 } |
| 11637 return null; | 12424 return null; |
| 11638 } | 12425 } |
| 11639 | 12426 |
| 11640 @override | 12427 @override |
| 11641 Object visitClassTypeAlias(ClassTypeAlias node) { | 12428 Object visitClassTypeAlias(ClassTypeAlias node) { |
| 11642 Scope outerScope = _nameScope; | 12429 Scope outerScope = _nameScope; |
| 11643 try { | 12430 try { |
| 11644 _nameScope = new ClassScope(_nameScope, node.element); | 12431 _nameScope = new ClassScope(_nameScope, node.element); |
| 11645 super.visitClassTypeAlias(node); | 12432 super.visitClassTypeAlias(node); |
| 11646 } finally { | 12433 } finally { |
| 11647 _nameScope = outerScope; | 12434 _nameScope = outerScope; |
| 11648 } | 12435 } |
| 11649 return null; | 12436 return null; |
| 11650 } | 12437 } |
| 11651 | 12438 |
| 11652 @override | 12439 @override |
| 11653 Object visitConstructorDeclaration(ConstructorDeclaration node) { | 12440 Object visitConstructorDeclaration(ConstructorDeclaration node) { |
| 12441 ConstructorElement constructorElement = node.element; |
| 11654 Scope outerScope = _nameScope; | 12442 Scope outerScope = _nameScope; |
| 11655 try { | 12443 try { |
| 11656 _nameScope = new FunctionScope(_nameScope, node.element); | 12444 if (constructorElement == null) { |
| 12445 JavaStringBuilder builder = new JavaStringBuilder(); |
| 12446 builder.append("Missing element for constructor "); |
| 12447 builder.append(node.returnType.name); |
| 12448 if (node.name != null) { |
| 12449 builder.append("."); |
| 12450 builder.append(node.name.name); |
| 12451 } |
| 12452 builder.append(" in "); |
| 12453 builder.append(definingLibrary.source.fullName); |
| 12454 AnalysisEngine.instance.logger.logInformation2(builder.toString(), new J
avaException()); |
| 12455 } else { |
| 12456 _nameScope = new FunctionScope(_nameScope, constructorElement); |
| 12457 } |
| 11657 super.visitConstructorDeclaration(node); | 12458 super.visitConstructorDeclaration(node); |
| 11658 } finally { | 12459 } finally { |
| 11659 _nameScope = outerScope; | 12460 _nameScope = outerScope; |
| 11660 } | 12461 } |
| 11661 return null; | 12462 return null; |
| 11662 } | 12463 } |
| 11663 | 12464 |
| 11664 @override | 12465 @override |
| 11665 Object visitDeclaredIdentifier(DeclaredIdentifier node) { | 12466 Object visitDeclaredIdentifier(DeclaredIdentifier node) { |
| 11666 VariableElement element = node.element; | 12467 VariableElement element = node.element; |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 11722 visitForStatementInScope(node); | 12523 visitForStatementInScope(node); |
| 11723 } finally { | 12524 } finally { |
| 11724 _labelScope = outerLabelScope; | 12525 _labelScope = outerLabelScope; |
| 11725 _nameScope = outerNameScope; | 12526 _nameScope = outerNameScope; |
| 11726 } | 12527 } |
| 11727 return null; | 12528 return null; |
| 11728 } | 12529 } |
| 11729 | 12530 |
| 11730 @override | 12531 @override |
| 11731 Object visitFunctionDeclaration(FunctionDeclaration node) { | 12532 Object visitFunctionDeclaration(FunctionDeclaration node) { |
| 11732 ExecutableElement function = node.element; | 12533 ExecutableElement functionElement = node.element; |
| 11733 Scope outerScope = _nameScope; | 12534 Scope outerScope = _nameScope; |
| 11734 try { | 12535 try { |
| 11735 _nameScope = new FunctionScope(_nameScope, function); | 12536 if (functionElement == null) { |
| 12537 AnalysisEngine.instance.logger.logInformation2("Missing element for top-
level function ${node.name.name} in ${definingLibrary.source.fullName}", new Jav
aException()); |
| 12538 } else { |
| 12539 _nameScope = new FunctionScope(_nameScope, functionElement); |
| 12540 } |
| 11736 super.visitFunctionDeclaration(node); | 12541 super.visitFunctionDeclaration(node); |
| 11737 } finally { | 12542 } finally { |
| 11738 _nameScope = outerScope; | 12543 _nameScope = outerScope; |
| 11739 } | 12544 } |
| 11740 if (function.enclosingElement is! CompilationUnitElement) { | 12545 if (functionElement.enclosingElement is! CompilationUnitElement) { |
| 11741 _nameScope.define(function); | 12546 _nameScope.define(functionElement); |
| 11742 } | 12547 } |
| 11743 return null; | 12548 return null; |
| 11744 } | 12549 } |
| 11745 | 12550 |
| 11746 @override | 12551 @override |
| 11747 Object visitFunctionExpression(FunctionExpression node) { | 12552 Object visitFunctionExpression(FunctionExpression node) { |
| 11748 if (node.parent is FunctionDeclaration) { | 12553 if (node.parent is FunctionDeclaration) { |
| 11749 // We have already created a function scope and don't need to do so again. | 12554 // We have already created a function scope and don't need to do so again. |
| 11750 super.visitFunctionExpression(node); | 12555 super.visitFunctionExpression(node); |
| 11751 } else { | 12556 } else { |
| 11752 Scope outerScope = _nameScope; | 12557 Scope outerScope = _nameScope; |
| 11753 try { | 12558 try { |
| 11754 ExecutableElement functionElement = node.element; | 12559 ExecutableElement functionElement = node.element; |
| 11755 if (functionElement == null) { | 12560 if (functionElement == null) { |
| 12561 JavaStringBuilder builder = new JavaStringBuilder(); |
| 12562 builder.append("Missing element for function "); |
| 12563 AstNode parent = node.parent; |
| 12564 while (parent != null) { |
| 12565 if (parent is Declaration) { |
| 12566 Element parentElement = (parent as Declaration).element; |
| 12567 builder.append(parentElement == null ? "<unknown> " : ("${parentEl
ement.name} ")); |
| 12568 } |
| 12569 parent = parent.parent; |
| 12570 } |
| 12571 builder.append("in "); |
| 12572 builder.append(definingLibrary.source.fullName); |
| 12573 AnalysisEngine.instance.logger.logInformation2(builder.toString(), new
JavaException()); |
| 11756 } else { | 12574 } else { |
| 11757 _nameScope = new FunctionScope(_nameScope, functionElement); | 12575 _nameScope = new FunctionScope(_nameScope, functionElement); |
| 11758 } | 12576 } |
| 11759 super.visitFunctionExpression(node); | 12577 super.visitFunctionExpression(node); |
| 11760 } finally { | 12578 } finally { |
| 11761 _nameScope = outerScope; | 12579 _nameScope = outerScope; |
| 11762 } | 12580 } |
| 11763 } | 12581 } |
| 11764 return null; | 12582 return null; |
| 11765 } | 12583 } |
| (...skipping 26 matching lines...) Expand all Loading... |
| 11792 } finally { | 12610 } finally { |
| 11793 _labelScope = outerScope; | 12611 _labelScope = outerScope; |
| 11794 } | 12612 } |
| 11795 return null; | 12613 return null; |
| 11796 } | 12614 } |
| 11797 | 12615 |
| 11798 @override | 12616 @override |
| 11799 Object visitMethodDeclaration(MethodDeclaration node) { | 12617 Object visitMethodDeclaration(MethodDeclaration node) { |
| 11800 Scope outerScope = _nameScope; | 12618 Scope outerScope = _nameScope; |
| 11801 try { | 12619 try { |
| 11802 _nameScope = new FunctionScope(_nameScope, node.element); | 12620 ExecutableElement methodElement = node.element; |
| 12621 if (methodElement == null) { |
| 12622 AnalysisEngine.instance.logger.logInformation2("Missing element for meth
od ${node.name.name} in ${definingLibrary.source.fullName}", new JavaException()
); |
| 12623 } else { |
| 12624 _nameScope = new FunctionScope(_nameScope, methodElement); |
| 12625 } |
| 11803 super.visitMethodDeclaration(node); | 12626 super.visitMethodDeclaration(node); |
| 11804 } finally { | 12627 } finally { |
| 11805 _nameScope = outerScope; | 12628 _nameScope = outerScope; |
| 11806 } | 12629 } |
| 11807 return null; | 12630 return null; |
| 11808 } | 12631 } |
| 11809 | 12632 |
| 11810 @override | 12633 @override |
| 11811 Object visitSwitchCase(SwitchCase node) { | 12634 Object visitSwitchCase(SwitchCase node) { |
| 11812 node.expression.accept(this); | 12635 node.expression.accept(this); |
| (...skipping 2781 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 14594 * @param source the source representing the compilation unit containing the n
ode being visited | 15417 * @param source the source representing the compilation unit containing the n
ode being visited |
| 14595 * @param typeProvider the object used to access the types from the core libra
ry | 15418 * @param typeProvider the object used to access the types from the core libra
ry |
| 14596 * @param nameScope the scope used to resolve identifiers in the node that wil
l first be visited | 15419 * @param nameScope the scope used to resolve identifiers in the node that wil
l first be visited |
| 14597 * @param errorListener the error listener that will be informed of any errors
that are found | 15420 * @param errorListener the error listener that will be informed of any errors
that are found |
| 14598 * during resolution | 15421 * during resolution |
| 14599 */ | 15422 */ |
| 14600 TypeResolverVisitor.con3(LibraryElement definingLibrary, Source source, TypePr
ovider typeProvider, Scope nameScope, AnalysisErrorListener errorListener) : sup
er.con3(definingLibrary, source, typeProvider, nameScope, errorListener) { | 15423 TypeResolverVisitor.con3(LibraryElement definingLibrary, Source source, TypePr
ovider typeProvider, Scope nameScope, AnalysisErrorListener errorListener) : sup
er.con3(definingLibrary, source, typeProvider, nameScope, errorListener) { |
| 14601 _dynamicType = typeProvider.dynamicType; | 15424 _dynamicType = typeProvider.dynamicType; |
| 14602 } | 15425 } |
| 14603 | 15426 |
| 15427 /** |
| 15428 * Initialize a newly created visitor to resolve the nodes in a compilation un
it. |
| 15429 * |
| 15430 * @param library the library containing the compilation unit being resolved |
| 15431 * @param source the source representing the compilation unit being visited |
| 15432 * @param typeProvider the object used to access the types from the core libra
ry |
| 15433 */ |
| 15434 TypeResolverVisitor.con4(ResolvableLibrary library, Source source, TypeProvide
r typeProvider) : super.con4(library, source, typeProvider) { |
| 15435 _dynamicType = typeProvider.dynamicType; |
| 15436 } |
| 15437 |
| 14604 @override | 15438 @override |
| 14605 Object visitCatchClause(CatchClause node) { | 15439 Object visitCatchClause(CatchClause node) { |
| 14606 super.visitCatchClause(node); | 15440 super.visitCatchClause(node); |
| 14607 SimpleIdentifier exception = node.exceptionParameter; | 15441 SimpleIdentifier exception = node.exceptionParameter; |
| 14608 if (exception != null) { | 15442 if (exception != null) { |
| 14609 // If an 'on' clause is provided the type of the exception parameter is th
e type in the 'on' | 15443 // If an 'on' clause is provided the type of the exception parameter is th
e type in the 'on' |
| 14610 // clause. Otherwise, the type of the exception parameter is 'Object'. | 15444 // clause. Otherwise, the type of the exception parameter is 'Object'. |
| 14611 TypeName exceptionTypeName = node.exceptionType; | 15445 TypeName exceptionTypeName = node.exceptionType; |
| 14612 DartType exceptionType; | 15446 DartType exceptionType; |
| 14613 if (exceptionTypeName == null) { | 15447 if (exceptionTypeName == null) { |
| (...skipping 1031 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 15645 * | 16479 * |
| 15646 * @param definingLibrary the element for the library containing the node bein
g visited | 16480 * @param definingLibrary the element for the library containing the node bein
g visited |
| 15647 * @param source the source representing the compilation unit containing the n
ode being visited | 16481 * @param source the source representing the compilation unit containing the n
ode being visited |
| 15648 * @param typeProvider the object used to access the types from the core libra
ry | 16482 * @param typeProvider the object used to access the types from the core libra
ry |
| 15649 * @param nameScope the scope used to resolve identifiers in the node that wil
l first be visited | 16483 * @param nameScope the scope used to resolve identifiers in the node that wil
l first be visited |
| 15650 * @param errorListener the error listener that will be informed of any errors
that are found | 16484 * @param errorListener the error listener that will be informed of any errors
that are found |
| 15651 * during resolution | 16485 * during resolution |
| 15652 */ | 16486 */ |
| 15653 VariableResolverVisitor.con2(LibraryElement definingLibrary, Source source, Ty
peProvider typeProvider, Scope nameScope, AnalysisErrorListener errorListener) :
super.con3(definingLibrary, source, typeProvider, nameScope, errorListener); | 16487 VariableResolverVisitor.con2(LibraryElement definingLibrary, Source source, Ty
peProvider typeProvider, Scope nameScope, AnalysisErrorListener errorListener) :
super.con3(definingLibrary, source, typeProvider, nameScope, errorListener); |
| 15654 | 16488 |
| 16489 /** |
| 16490 * Initialize a newly created visitor to resolve the nodes in a compilation un
it. |
| 16491 * |
| 16492 * @param library the library containing the compilation unit being resolved |
| 16493 * @param source the source representing the compilation unit being visited |
| 16494 * @param typeProvider the object used to access the types from the core libra
ry |
| 16495 */ |
| 16496 VariableResolverVisitor.con3(ResolvableLibrary library, Source source, TypePro
vider typeProvider) : super.con4(library, source, typeProvider); |
| 16497 |
| 15655 @override | 16498 @override |
| 15656 Object visitFunctionDeclaration(FunctionDeclaration node) { | 16499 Object visitFunctionDeclaration(FunctionDeclaration node) { |
| 15657 ExecutableElement outerFunction = _enclosingFunction; | 16500 ExecutableElement outerFunction = _enclosingFunction; |
| 15658 try { | 16501 try { |
| 15659 _enclosingFunction = node.element; | 16502 _enclosingFunction = node.element; |
| 15660 return super.visitFunctionDeclaration(node); | 16503 return super.visitFunctionDeclaration(node); |
| 15661 } finally { | 16504 } finally { |
| 15662 _enclosingFunction = outerFunction; | 16505 _enclosingFunction = outerFunction; |
| 15663 } | 16506 } |
| 15664 } | 16507 } |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 15736 * Instances of the class `ClassScope` implement the scope defined by a class. | 16579 * Instances of the class `ClassScope` implement the scope defined by a class. |
| 15737 */ | 16580 */ |
| 15738 class ClassScope extends EnclosedScope { | 16581 class ClassScope extends EnclosedScope { |
| 15739 /** | 16582 /** |
| 15740 * Initialize a newly created scope enclosed within another scope. | 16583 * Initialize a newly created scope enclosed within another scope. |
| 15741 * | 16584 * |
| 15742 * @param enclosingScope the scope in which this scope is lexically enclosed | 16585 * @param enclosingScope the scope in which this scope is lexically enclosed |
| 15743 * @param typeElement the element representing the type represented by this sc
ope | 16586 * @param typeElement the element representing the type represented by this sc
ope |
| 15744 */ | 16587 */ |
| 15745 ClassScope(Scope enclosingScope, ClassElement typeElement) : super(new Enclose
dScope(enclosingScope)) { | 16588 ClassScope(Scope enclosingScope, ClassElement typeElement) : super(new Enclose
dScope(enclosingScope)) { |
| 16589 if (typeElement == null) { |
| 16590 throw new IllegalArgumentException("class element cannot be null"); |
| 16591 } |
| 15746 _defineTypeParameters(typeElement); | 16592 _defineTypeParameters(typeElement); |
| 15747 _defineMembers(typeElement); | 16593 _defineMembers(typeElement); |
| 15748 } | 16594 } |
| 15749 | 16595 |
| 15750 @override | 16596 @override |
| 15751 AnalysisError getErrorForDuplicate(Element existing, Element duplicate) { | 16597 AnalysisError getErrorForDuplicate(Element existing, Element duplicate) { |
| 15752 if (existing is PropertyAccessorElement && duplicate is MethodElement) { | 16598 if (existing is PropertyAccessorElement && duplicate is MethodElement) { |
| 15753 if (existing.nameOffset < duplicate.nameOffset) { | 16599 if (existing.nameOffset < duplicate.nameOffset) { |
| 15754 return new AnalysisError.con2(duplicate.source, duplicate.nameOffset, du
plicate.displayName.length, CompileTimeErrorCode.METHOD_AND_GETTER_WITH_SAME_NAM
E, [existing.displayName]); | 16600 return new AnalysisError.con2(duplicate.source, duplicate.nameOffset, du
plicate.displayName.length, CompileTimeErrorCode.METHOD_AND_GETTER_WITH_SAME_NAM
E, [existing.displayName]); |
| 15755 } else { | 16601 } else { |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 15864 | 16710 |
| 15865 bool _parametersDefined = false; | 16711 bool _parametersDefined = false; |
| 15866 | 16712 |
| 15867 /** | 16713 /** |
| 15868 * Initialize a newly created scope enclosed within another scope. | 16714 * Initialize a newly created scope enclosed within another scope. |
| 15869 * | 16715 * |
| 15870 * @param enclosingScope the scope in which this scope is lexically enclosed | 16716 * @param enclosingScope the scope in which this scope is lexically enclosed |
| 15871 * @param functionElement the element representing the type represented by thi
s scope | 16717 * @param functionElement the element representing the type represented by thi
s scope |
| 15872 */ | 16718 */ |
| 15873 FunctionScope(Scope enclosingScope, ExecutableElement functionElement) : super
(new EnclosedScope(enclosingScope)) { | 16719 FunctionScope(Scope enclosingScope, ExecutableElement functionElement) : super
(new EnclosedScope(enclosingScope)) { |
| 16720 if (functionElement == null) { |
| 16721 throw new IllegalArgumentException("function element cannot be null"); |
| 16722 } |
| 15874 this._functionElement = functionElement; | 16723 this._functionElement = functionElement; |
| 15875 } | 16724 } |
| 15876 | 16725 |
| 15877 /** | 16726 /** |
| 15878 * Define the parameters for the given function in the scope that encloses thi
s function. | 16727 * Define the parameters for the given function in the scope that encloses thi
s function. |
| 15879 */ | 16728 */ |
| 15880 void defineParameters() { | 16729 void defineParameters() { |
| 15881 if (_parametersDefined) { | 16730 if (_parametersDefined) { |
| 15882 return; | 16731 return; |
| 15883 } | 16732 } |
| (...skipping 881 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 16765 Scope _scopeForAstNode(AstNode node) { | 17614 Scope _scopeForAstNode(AstNode node) { |
| 16766 if (node is CompilationUnit) { | 17615 if (node is CompilationUnit) { |
| 16767 return _scopeForCompilationUnit(node); | 17616 return _scopeForCompilationUnit(node); |
| 16768 } | 17617 } |
| 16769 AstNode parent = node.parent; | 17618 AstNode parent = node.parent; |
| 16770 if (parent == null) { | 17619 if (parent == null) { |
| 16771 throw new AnalysisException.con1("Cannot create scope: node is not part of
a CompilationUnit"); | 17620 throw new AnalysisException.con1("Cannot create scope: node is not part of
a CompilationUnit"); |
| 16772 } | 17621 } |
| 16773 Scope scope = _scopeForAstNode(parent); | 17622 Scope scope = _scopeForAstNode(parent); |
| 16774 if (node is ClassDeclaration) { | 17623 if (node is ClassDeclaration) { |
| 16775 scope = new ClassScope(scope, node.element); | 17624 ClassElement element = node.element; |
| 17625 if (element == null) { |
| 17626 throw new AnalysisException.con1("Cannot build a scope for an unresolved
class"); |
| 17627 } |
| 17628 scope = new ClassScope(scope, element); |
| 16776 } else if (node is ClassTypeAlias) { | 17629 } else if (node is ClassTypeAlias) { |
| 16777 scope = new ClassScope(scope, node.element); | 17630 ClassElement element = node.element; |
| 17631 if (element == null) { |
| 17632 throw new AnalysisException.con1("Cannot build a scope for an unresolved
class type alias"); |
| 17633 } |
| 17634 scope = new ClassScope(scope, element); |
| 16778 } else if (node is ConstructorDeclaration) { | 17635 } else if (node is ConstructorDeclaration) { |
| 16779 FunctionScope functionScope = new FunctionScope(scope, node.element); | 17636 ConstructorElement element = node.element; |
| 17637 if (element == null) { |
| 17638 throw new AnalysisException.con1("Cannot build a scope for an unresolved
constructor"); |
| 17639 } |
| 17640 FunctionScope functionScope = new FunctionScope(scope, element); |
| 16780 functionScope.defineParameters(); | 17641 functionScope.defineParameters(); |
| 16781 scope = functionScope; | 17642 scope = functionScope; |
| 16782 } else if (node is FunctionDeclaration) { | 17643 } else if (node is FunctionDeclaration) { |
| 16783 FunctionScope functionScope = new FunctionScope(scope, node.element); | 17644 ExecutableElement element = node.element; |
| 17645 if (element == null) { |
| 17646 throw new AnalysisException.con1("Cannot build a scope for an unresolved
function"); |
| 17647 } |
| 17648 FunctionScope functionScope = new FunctionScope(scope, element); |
| 16784 functionScope.defineParameters(); | 17649 functionScope.defineParameters(); |
| 16785 scope = functionScope; | 17650 scope = functionScope; |
| 16786 } else if (node is FunctionTypeAlias) { | 17651 } else if (node is FunctionTypeAlias) { |
| 16787 scope = new FunctionTypeScope(scope, node.element); | 17652 scope = new FunctionTypeScope(scope, node.element); |
| 16788 } else if (node is MethodDeclaration) { | 17653 } else if (node is MethodDeclaration) { |
| 16789 FunctionScope functionScope = new FunctionScope(scope, node.element); | 17654 ExecutableElement element = node.element; |
| 17655 if (element == null) { |
| 17656 throw new AnalysisException.con1("Cannot build a scope for an unresolved
method"); |
| 17657 } |
| 17658 FunctionScope functionScope = new FunctionScope(scope, element); |
| 16790 functionScope.defineParameters(); | 17659 functionScope.defineParameters(); |
| 16791 scope = functionScope; | 17660 scope = functionScope; |
| 16792 } | 17661 } |
| 16793 return scope; | 17662 return scope; |
| 16794 } | 17663 } |
| 16795 | 17664 |
| 16796 Scope _scopeForCompilationUnit(CompilationUnit node) { | 17665 Scope _scopeForCompilationUnit(CompilationUnit node) { |
| 16797 CompilationUnitElement unitElement = node.element; | 17666 CompilationUnitElement unitElement = node.element; |
| 16798 if (unitElement == null) { | 17667 if (unitElement == null) { |
| 16799 throw new AnalysisException.con1("Cannot create scope: compilation unit is
not resolved"); | 17668 throw new AnalysisException.con1("Cannot create scope: compilation unit is
not resolved"); |
| (...skipping 700 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 17500 } finally { | 18369 } finally { |
| 17501 _isInNativeClass = false; | 18370 _isInNativeClass = false; |
| 17502 _initialFieldElementsMap = null; | 18371 _initialFieldElementsMap = null; |
| 17503 _enclosingClass = outerClass; | 18372 _enclosingClass = outerClass; |
| 17504 } | 18373 } |
| 17505 } | 18374 } |
| 17506 | 18375 |
| 17507 @override | 18376 @override |
| 17508 Object visitClassTypeAlias(ClassTypeAlias node) { | 18377 Object visitClassTypeAlias(ClassTypeAlias node) { |
| 17509 _checkForBuiltInIdentifierAsName(node.name, CompileTimeErrorCode.BUILT_IN_ID
ENTIFIER_AS_TYPEDEF_NAME); | 18378 _checkForBuiltInIdentifierAsName(node.name, CompileTimeErrorCode.BUILT_IN_ID
ENTIFIER_AS_TYPEDEF_NAME); |
| 18379 _checkForExtendsDisallowedClassInTypeAlias(node); |
| 18380 _checkForImplementsDisallowedClass(node.implementsClause); |
| 17510 _checkForAllMixinErrorCodes(node.withClause); | 18381 _checkForAllMixinErrorCodes(node.withClause); |
| 17511 ClassElement outerClassElement = _enclosingClass; | 18382 ClassElement outerClassElement = _enclosingClass; |
| 17512 try { | 18383 try { |
| 17513 _enclosingClass = node.element; | 18384 _enclosingClass = node.element; |
| 17514 _checkForRecursiveInterfaceInheritance(node.element); | 18385 _checkForRecursiveInterfaceInheritance(node.element); |
| 17515 _checkForTypeAliasCannotReferenceItself_mixin(node); | 18386 _checkForTypeAliasCannotReferenceItself_mixin(node); |
| 17516 } finally { | 18387 } finally { |
| 17517 _enclosingClass = outerClassElement; | 18388 _enclosingClass = outerClassElement; |
| 17518 } | 18389 } |
| 17519 return super.visitClassTypeAlias(node); | 18390 return super.visitClassTypeAlias(node); |
| (...skipping 2214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 19734 * @see CompileTimeErrorCode#EXTENDS_DISALLOWED_CLASS | 20605 * @see CompileTimeErrorCode#EXTENDS_DISALLOWED_CLASS |
| 19735 */ | 20606 */ |
| 19736 bool _checkForExtendsDisallowedClass(ExtendsClause node) { | 20607 bool _checkForExtendsDisallowedClass(ExtendsClause node) { |
| 19737 if (node == null) { | 20608 if (node == null) { |
| 19738 return false; | 20609 return false; |
| 19739 } | 20610 } |
| 19740 return _checkForExtendsOrImplementsDisallowedClass(node.superclass, CompileT
imeErrorCode.EXTENDS_DISALLOWED_CLASS); | 20611 return _checkForExtendsOrImplementsDisallowedClass(node.superclass, CompileT
imeErrorCode.EXTENDS_DISALLOWED_CLASS); |
| 19741 } | 20612 } |
| 19742 | 20613 |
| 19743 /** | 20614 /** |
| 20615 * This verifies that the passed type alias does not extend classes such as nu
m or String. |
| 20616 * |
| 20617 * @param node the extends clause to test |
| 20618 * @return `true` if and only if an error code is generated on the passed node |
| 20619 * @see CompileTimeErrorCode#EXTENDS_DISALLOWED_CLASS |
| 20620 */ |
| 20621 bool _checkForExtendsDisallowedClassInTypeAlias(ClassTypeAlias node) { |
| 20622 if (node == null) { |
| 20623 return false; |
| 20624 } |
| 20625 return _checkForExtendsOrImplementsDisallowedClass(node.superclass, CompileT
imeErrorCode.EXTENDS_DISALLOWED_CLASS); |
| 20626 } |
| 20627 |
| 20628 /** |
| 19744 * This verifies that the passed type name does not extend or implement classe
s such as 'num' or | 20629 * This verifies that the passed type name does not extend or implement classe
s such as 'num' or |
| 19745 * 'String'. | 20630 * 'String'. |
| 19746 * | 20631 * |
| 19747 * @param node the type name to test | 20632 * @param node the type name to test |
| 19748 * @return `true` if and only if an error code is generated on the passed node | 20633 * @return `true` if and only if an error code is generated on the passed node |
| 19749 * @see #checkForExtendsDisallowedClass(ExtendsClause) | 20634 * @see #checkForExtendsDisallowedClass(ExtendsClause) |
| 19750 * @see #checkForImplementsDisallowedClass(ImplementsClause) | 20635 * @see #checkForImplementsDisallowedClass(ImplementsClause) |
| 19751 * @see CompileTimeErrorCode#EXTENDS_DISALLOWED_CLASS | 20636 * @see CompileTimeErrorCode#EXTENDS_DISALLOWED_CLASS |
| 19752 * @see CompileTimeErrorCode#IMPLEMENTS_DISALLOWED_CLASS | 20637 * @see CompileTimeErrorCode#IMPLEMENTS_DISALLOWED_CLASS |
| 19753 */ | 20638 */ |
| (...skipping 2401 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 22155 this.message = message; | 23040 this.message = message; |
| 22156 this.correction9 = correction; | 23041 this.correction9 = correction; |
| 22157 } | 23042 } |
| 22158 | 23043 |
| 22159 @override | 23044 @override |
| 22160 String get correction => correction9; | 23045 String get correction => correction9; |
| 22161 | 23046 |
| 22162 @override | 23047 @override |
| 22163 ErrorSeverity get errorSeverity => type.severity; | 23048 ErrorSeverity get errorSeverity => type.severity; |
| 22164 } | 23049 } |
| OLD | NEW |