| OLD | NEW |
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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 /** | 5 /** |
| 6 * This library is capable of producing linked summaries from unlinked | 6 * This library is capable of producing linked summaries from unlinked |
| 7 * ones (or prelinked ones). It functions by building a miniature | 7 * ones (or prelinked ones). It functions by building a miniature |
| 8 * element model to represent the contents of the summaries, and then | 8 * element model to represent the contents of the summaries, and then |
| 9 * scanning the element model to gather linked information and adding | 9 * scanning the element model to gather linked information and adding |
| 10 * it to the summary data structures. | 10 * it to the summary data structures. |
| (...skipping 1431 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1442 ConstructorElementForLink constructor = constructorElement | 1442 ConstructorElementForLink constructor = constructorElement |
| 1443 .enclosingClass | 1443 .enclosingClass |
| 1444 .getContainedName(constructorInitializer.name) | 1444 .getContainedName(constructorInitializer.name) |
| 1445 .asConstructor; | 1445 .asConstructor; |
| 1446 safeAddDependency(constructor?._constNode); | 1446 safeAddDependency(constructor?._constNode); |
| 1447 } | 1447 } |
| 1448 CompilationUnitElementForLink compilationUnit = | 1448 CompilationUnitElementForLink compilationUnit = |
| 1449 constructorElement.enclosingElement.enclosingElement; | 1449 constructorElement.enclosingElement.enclosingElement; |
| 1450 collectDependencies( | 1450 collectDependencies( |
| 1451 dependencies, constructorInitializer.expression, compilationUnit); | 1451 dependencies, constructorInitializer.expression, compilationUnit); |
| 1452 for (UnlinkedConst unlinkedConst in constructorInitializer.arguments) { | 1452 for (UnlinkedExpr unlinkedConst in constructorInitializer.arguments) { |
| 1453 collectDependencies(dependencies, unlinkedConst, compilationUnit); | 1453 collectDependencies(dependencies, unlinkedConst, compilationUnit); |
| 1454 } | 1454 } |
| 1455 } | 1455 } |
| 1456 | 1456 |
| 1457 if (defaultSuperInvocationNeeded) { | 1457 if (defaultSuperInvocationNeeded) { |
| 1458 // No explicit superconstructor invocation found, so we need to | 1458 // No explicit superconstructor invocation found, so we need to |
| 1459 // manually insert a reference to the implicit superconstructor. | 1459 // manually insert a reference to the implicit superconstructor. |
| 1460 if (superClass != null && !superClass.isObject) { | 1460 if (superClass != null && !superClass.isObject) { |
| 1461 ConstructorElementForLink unnamedConstructor = | 1461 ConstructorElementForLink unnamedConstructor = |
| 1462 superClass.unnamedConstructor; | 1462 superClass.unnamedConstructor; |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1527 @override | 1527 @override |
| 1528 bool isEvaluated = false; | 1528 bool isEvaluated = false; |
| 1529 | 1529 |
| 1530 /** | 1530 /** |
| 1531 * Collect the dependencies in [unlinkedConst] (which should be | 1531 * Collect the dependencies in [unlinkedConst] (which should be |
| 1532 * interpreted relative to [compilationUnit]) and store them in | 1532 * interpreted relative to [compilationUnit]) and store them in |
| 1533 * [dependencies]. | 1533 * [dependencies]. |
| 1534 */ | 1534 */ |
| 1535 void collectDependencies( | 1535 void collectDependencies( |
| 1536 List<ConstNode> dependencies, | 1536 List<ConstNode> dependencies, |
| 1537 UnlinkedConst unlinkedConst, | 1537 UnlinkedExpr unlinkedConst, |
| 1538 CompilationUnitElementForLink compilationUnit) { | 1538 CompilationUnitElementForLink compilationUnit) { |
| 1539 if (unlinkedConst == null) { | 1539 if (unlinkedConst == null) { |
| 1540 return; | 1540 return; |
| 1541 } | 1541 } |
| 1542 int refPtr = 0; | 1542 int refPtr = 0; |
| 1543 int intPtr = 0; | 1543 int intPtr = 0; |
| 1544 for (UnlinkedConstOperation operation in unlinkedConst.operations) { | 1544 for (UnlinkedExprOperation operation in unlinkedConst.operations) { |
| 1545 switch (operation) { | 1545 switch (operation) { |
| 1546 case UnlinkedConstOperation.pushInt: | 1546 case UnlinkedExprOperation.pushInt: |
| 1547 intPtr++; | 1547 intPtr++; |
| 1548 break; | 1548 break; |
| 1549 case UnlinkedConstOperation.pushLongInt: | 1549 case UnlinkedExprOperation.pushLongInt: |
| 1550 int numInts = unlinkedConst.ints[intPtr++]; | 1550 int numInts = unlinkedConst.ints[intPtr++]; |
| 1551 intPtr += numInts; | 1551 intPtr += numInts; |
| 1552 break; | 1552 break; |
| 1553 case UnlinkedConstOperation.concatenate: | 1553 case UnlinkedExprOperation.concatenate: |
| 1554 intPtr++; | 1554 intPtr++; |
| 1555 break; | 1555 break; |
| 1556 case UnlinkedConstOperation.pushReference: | 1556 case UnlinkedExprOperation.pushReference: |
| 1557 EntityRef ref = unlinkedConst.references[refPtr++]; | 1557 EntityRef ref = unlinkedConst.references[refPtr++]; |
| 1558 ConstVariableNode variable = | 1558 ConstVariableNode variable = |
| 1559 compilationUnit.resolveRef(ref.reference).asConstVariable; | 1559 compilationUnit.resolveRef(ref.reference).asConstVariable; |
| 1560 if (variable != null) { | 1560 if (variable != null) { |
| 1561 dependencies.add(variable); | 1561 dependencies.add(variable); |
| 1562 } | 1562 } |
| 1563 break; | 1563 break; |
| 1564 case UnlinkedConstOperation.makeUntypedList: | 1564 case UnlinkedExprOperation.makeUntypedList: |
| 1565 case UnlinkedConstOperation.makeUntypedMap: | 1565 case UnlinkedExprOperation.makeUntypedMap: |
| 1566 intPtr++; | 1566 intPtr++; |
| 1567 break; | 1567 break; |
| 1568 case UnlinkedConstOperation.assignToRef: | 1568 case UnlinkedExprOperation.assignToRef: |
| 1569 refPtr++; | 1569 refPtr++; |
| 1570 break; | 1570 break; |
| 1571 case UnlinkedConstOperation.invokeMethodRef: | 1571 case UnlinkedExprOperation.invokeMethodRef: |
| 1572 EntityRef ref = unlinkedConst.references[refPtr++]; | 1572 EntityRef ref = unlinkedConst.references[refPtr++]; |
| 1573 ConstVariableNode variable = | 1573 ConstVariableNode variable = |
| 1574 compilationUnit.resolveRef(ref.reference).asConstVariable; | 1574 compilationUnit.resolveRef(ref.reference).asConstVariable; |
| 1575 if (variable != null) { | 1575 if (variable != null) { |
| 1576 dependencies.add(variable); | 1576 dependencies.add(variable); |
| 1577 } | 1577 } |
| 1578 intPtr += 2; | 1578 intPtr += 2; |
| 1579 int numTypeArguments = unlinkedConst.ints[intPtr++]; | 1579 int numTypeArguments = unlinkedConst.ints[intPtr++]; |
| 1580 refPtr += numTypeArguments; | 1580 refPtr += numTypeArguments; |
| 1581 break; | 1581 break; |
| 1582 case UnlinkedConstOperation.invokeMethod: | 1582 case UnlinkedExprOperation.invokeMethod: |
| 1583 intPtr += 2; | 1583 intPtr += 2; |
| 1584 int numTypeArguments = unlinkedConst.ints[intPtr++]; | 1584 int numTypeArguments = unlinkedConst.ints[intPtr++]; |
| 1585 refPtr += numTypeArguments; | 1585 refPtr += numTypeArguments; |
| 1586 break; | 1586 break; |
| 1587 case UnlinkedConstOperation.makeTypedList: | 1587 case UnlinkedExprOperation.makeTypedList: |
| 1588 refPtr++; | 1588 refPtr++; |
| 1589 intPtr++; | 1589 intPtr++; |
| 1590 break; | 1590 break; |
| 1591 case UnlinkedConstOperation.makeTypedMap: | 1591 case UnlinkedExprOperation.makeTypedMap: |
| 1592 refPtr += 2; | 1592 refPtr += 2; |
| 1593 intPtr++; | 1593 intPtr++; |
| 1594 break; | 1594 break; |
| 1595 case UnlinkedConstOperation.invokeConstructor: | 1595 case UnlinkedExprOperation.invokeConstructor: |
| 1596 EntityRef ref = unlinkedConst.references[refPtr++]; | 1596 EntityRef ref = unlinkedConst.references[refPtr++]; |
| 1597 ConstructorElementForLink element = | 1597 ConstructorElementForLink element = |
| 1598 compilationUnit.resolveRef(ref.reference).asConstructor; | 1598 compilationUnit.resolveRef(ref.reference).asConstructor; |
| 1599 if (element?._constNode != null) { | 1599 if (element?._constNode != null) { |
| 1600 dependencies.add(element._constNode); | 1600 dependencies.add(element._constNode); |
| 1601 } | 1601 } |
| 1602 intPtr += 2; | 1602 intPtr += 2; |
| 1603 break; | 1603 break; |
| 1604 case UnlinkedConstOperation.typeCast: | 1604 case UnlinkedExprOperation.typeCast: |
| 1605 case UnlinkedConstOperation.typeCheck: | 1605 case UnlinkedExprOperation.typeCheck: |
| 1606 refPtr++; | 1606 refPtr++; |
| 1607 break; | 1607 break; |
| 1608 case UnlinkedConstOperation.pushLocalFunctionReference: | 1608 case UnlinkedExprOperation.pushLocalFunctionReference: |
| 1609 intPtr += 2; | 1609 intPtr += 2; |
| 1610 break; | 1610 break; |
| 1611 default: | 1611 default: |
| 1612 break; | 1612 break; |
| 1613 } | 1613 } |
| 1614 } | 1614 } |
| 1615 assert(refPtr == unlinkedConst.references.length); | 1615 assert(refPtr == unlinkedConst.references.length); |
| 1616 assert(intPtr == unlinkedConst.ints.length); | 1616 assert(intPtr == unlinkedConst.ints.length); |
| 1617 } | 1617 } |
| 1618 } | 1618 } |
| (...skipping 446 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2065 } | 2065 } |
| 2066 } | 2066 } |
| 2067 } | 2067 } |
| 2068 | 2068 |
| 2069 class ExprTypeComputer { | 2069 class ExprTypeComputer { |
| 2070 final FunctionElementForLink_Local function; | 2070 final FunctionElementForLink_Local function; |
| 2071 final CompilationUnitElementForLink unit; | 2071 final CompilationUnitElementForLink unit; |
| 2072 final LibraryElementForLink library; | 2072 final LibraryElementForLink library; |
| 2073 final Linker linker; | 2073 final Linker linker; |
| 2074 final TypeProvider typeProvider; | 2074 final TypeProvider typeProvider; |
| 2075 final UnlinkedConst unlinkedConst; | 2075 final UnlinkedExpr unlinkedConst; |
| 2076 | 2076 |
| 2077 final List<DartType> stack = <DartType>[]; | 2077 final List<DartType> stack = <DartType>[]; |
| 2078 int intPtr = 0; | 2078 int intPtr = 0; |
| 2079 int refPtr = 0; | 2079 int refPtr = 0; |
| 2080 int strPtr = 0; | 2080 int strPtr = 0; |
| 2081 int assignmentOperatorPtr = 0; | 2081 int assignmentOperatorPtr = 0; |
| 2082 | 2082 |
| 2083 factory ExprTypeComputer(FunctionElementForLink_Local functionElement) { | 2083 factory ExprTypeComputer(FunctionElementForLink_Local functionElement) { |
| 2084 CompilationUnitElementForLink unit = functionElement.compilationUnit; | 2084 CompilationUnitElementForLink unit = functionElement.compilationUnit; |
| 2085 LibraryElementForLink library = unit.enclosingElement; | 2085 LibraryElementForLink library = unit.enclosingElement; |
| 2086 Linker linker = library._linker; | 2086 Linker linker = library._linker; |
| 2087 TypeProvider typeProvider = linker.typeProvider; | 2087 TypeProvider typeProvider = linker.typeProvider; |
| 2088 UnlinkedConst unlinkedConst = functionElement._unlinkedExecutable.bodyExpr; | 2088 UnlinkedExpr unlinkedConst = functionElement._unlinkedExecutable.bodyExpr; |
| 2089 return new ExprTypeComputer._( | 2089 return new ExprTypeComputer._( |
| 2090 functionElement, unit, library, linker, typeProvider, unlinkedConst); | 2090 functionElement, unit, library, linker, typeProvider, unlinkedConst); |
| 2091 } | 2091 } |
| 2092 | 2092 |
| 2093 ExprTypeComputer._(this.function, this.unit, this.library, this.linker, | 2093 ExprTypeComputer._(this.function, this.unit, this.library, this.linker, |
| 2094 this.typeProvider, this.unlinkedConst); | 2094 this.typeProvider, this.unlinkedConst); |
| 2095 | 2095 |
| 2096 DartType compute() { | 2096 DartType compute() { |
| 2097 if (unlinkedConst == null) { | 2097 if (unlinkedConst == null) { |
| 2098 // No function body was stored for this function, so we can't infer its | 2098 // No function body was stored for this function, so we can't infer its |
| 2099 // return type. Assume `dynamic`. | 2099 // return type. Assume `dynamic`. |
| 2100 return DynamicTypeImpl.instance; | 2100 return DynamicTypeImpl.instance; |
| 2101 } | 2101 } |
| 2102 // Perform RPN evaluation of the constant, using a stack of inferred types. | 2102 // Perform RPN evaluation of the constant, using a stack of inferred types. |
| 2103 for (UnlinkedConstOperation operation in unlinkedConst.operations) { | 2103 for (UnlinkedExprOperation operation in unlinkedConst.operations) { |
| 2104 switch (operation) { | 2104 switch (operation) { |
| 2105 case UnlinkedConstOperation.pushInt: | 2105 case UnlinkedExprOperation.pushInt: |
| 2106 intPtr++; | 2106 intPtr++; |
| 2107 stack.add(typeProvider.intType); | 2107 stack.add(typeProvider.intType); |
| 2108 break; | 2108 break; |
| 2109 case UnlinkedConstOperation.pushLongInt: | 2109 case UnlinkedExprOperation.pushLongInt: |
| 2110 int numInts = _getNextInt(); | 2110 int numInts = _getNextInt(); |
| 2111 intPtr += numInts; | 2111 intPtr += numInts; |
| 2112 stack.add(typeProvider.intType); | 2112 stack.add(typeProvider.intType); |
| 2113 break; | 2113 break; |
| 2114 case UnlinkedConstOperation.pushDouble: | 2114 case UnlinkedExprOperation.pushDouble: |
| 2115 stack.add(typeProvider.doubleType); | 2115 stack.add(typeProvider.doubleType); |
| 2116 break; | 2116 break; |
| 2117 case UnlinkedConstOperation.pushTrue: | 2117 case UnlinkedExprOperation.pushTrue: |
| 2118 case UnlinkedConstOperation.pushFalse: | 2118 case UnlinkedExprOperation.pushFalse: |
| 2119 stack.add(typeProvider.boolType); | 2119 stack.add(typeProvider.boolType); |
| 2120 break; | 2120 break; |
| 2121 case UnlinkedConstOperation.pushString: | 2121 case UnlinkedExprOperation.pushString: |
| 2122 strPtr++; | 2122 strPtr++; |
| 2123 stack.add(typeProvider.stringType); | 2123 stack.add(typeProvider.stringType); |
| 2124 break; | 2124 break; |
| 2125 case UnlinkedConstOperation.concatenate: | 2125 case UnlinkedExprOperation.concatenate: |
| 2126 stack.length -= _getNextInt(); | 2126 stack.length -= _getNextInt(); |
| 2127 stack.add(typeProvider.stringType); | 2127 stack.add(typeProvider.stringType); |
| 2128 break; | 2128 break; |
| 2129 case UnlinkedConstOperation.makeSymbol: | 2129 case UnlinkedExprOperation.makeSymbol: |
| 2130 strPtr++; | 2130 strPtr++; |
| 2131 stack.add(typeProvider.symbolType); | 2131 stack.add(typeProvider.symbolType); |
| 2132 break; | 2132 break; |
| 2133 case UnlinkedConstOperation.pushNull: | 2133 case UnlinkedExprOperation.pushNull: |
| 2134 stack.add(BottomTypeImpl.instance); | 2134 stack.add(BottomTypeImpl.instance); |
| 2135 break; | 2135 break; |
| 2136 case UnlinkedConstOperation.pushReference: | 2136 case UnlinkedExprOperation.pushReference: |
| 2137 _doPushReference(); | 2137 _doPushReference(); |
| 2138 break; | 2138 break; |
| 2139 case UnlinkedConstOperation.extractProperty: | 2139 case UnlinkedExprOperation.extractProperty: |
| 2140 _doExtractProperty(); | 2140 _doExtractProperty(); |
| 2141 break; | 2141 break; |
| 2142 case UnlinkedConstOperation.invokeConstructor: | 2142 case UnlinkedExprOperation.invokeConstructor: |
| 2143 _doInvokeConstructor(); | 2143 _doInvokeConstructor(); |
| 2144 break; | 2144 break; |
| 2145 case UnlinkedConstOperation.makeUntypedList: | 2145 case UnlinkedExprOperation.makeUntypedList: |
| 2146 _doMakeUntypedList(); | 2146 _doMakeUntypedList(); |
| 2147 break; | 2147 break; |
| 2148 case UnlinkedConstOperation.makeUntypedMap: | 2148 case UnlinkedExprOperation.makeUntypedMap: |
| 2149 _doMakeUntypedMap(); | 2149 _doMakeUntypedMap(); |
| 2150 break; | 2150 break; |
| 2151 case UnlinkedConstOperation.makeTypedList: | 2151 case UnlinkedExprOperation.makeTypedList: |
| 2152 _doMakeTypedList(); | 2152 _doMakeTypedList(); |
| 2153 break; | 2153 break; |
| 2154 case UnlinkedConstOperation.makeTypedMap: | 2154 case UnlinkedExprOperation.makeTypedMap: |
| 2155 _doMakeTypeMap(); | 2155 _doMakeTypeMap(); |
| 2156 break; | 2156 break; |
| 2157 case UnlinkedConstOperation.not: | 2157 case UnlinkedExprOperation.not: |
| 2158 stack.length -= 1; | 2158 stack.length -= 1; |
| 2159 stack.add(typeProvider.boolType); | 2159 stack.add(typeProvider.boolType); |
| 2160 break; | 2160 break; |
| 2161 case UnlinkedConstOperation.complement: | 2161 case UnlinkedExprOperation.complement: |
| 2162 _computePrefixExpressionType('~'); | 2162 _computePrefixExpressionType('~'); |
| 2163 break; | 2163 break; |
| 2164 case UnlinkedConstOperation.negate: | 2164 case UnlinkedExprOperation.negate: |
| 2165 _computePrefixExpressionType('unary-'); | 2165 _computePrefixExpressionType('unary-'); |
| 2166 break; | 2166 break; |
| 2167 case UnlinkedConstOperation.and: | 2167 case UnlinkedExprOperation.and: |
| 2168 case UnlinkedConstOperation.or: | 2168 case UnlinkedExprOperation.or: |
| 2169 case UnlinkedConstOperation.equal: | 2169 case UnlinkedExprOperation.equal: |
| 2170 case UnlinkedConstOperation.notEqual: | 2170 case UnlinkedExprOperation.notEqual: |
| 2171 stack.length -= 2; | 2171 stack.length -= 2; |
| 2172 stack.add(typeProvider.boolType); | 2172 stack.add(typeProvider.boolType); |
| 2173 break; | 2173 break; |
| 2174 case UnlinkedConstOperation.bitXor: | 2174 case UnlinkedExprOperation.bitXor: |
| 2175 _computeBinaryExpressionType(TokenType.CARET); | 2175 _computeBinaryExpressionType(TokenType.CARET); |
| 2176 break; | 2176 break; |
| 2177 case UnlinkedConstOperation.bitAnd: | 2177 case UnlinkedExprOperation.bitAnd: |
| 2178 _computeBinaryExpressionType(TokenType.AMPERSAND); | 2178 _computeBinaryExpressionType(TokenType.AMPERSAND); |
| 2179 break; | 2179 break; |
| 2180 case UnlinkedConstOperation.bitOr: | 2180 case UnlinkedExprOperation.bitOr: |
| 2181 _computeBinaryExpressionType(TokenType.BAR); | 2181 _computeBinaryExpressionType(TokenType.BAR); |
| 2182 break; | 2182 break; |
| 2183 case UnlinkedConstOperation.bitShiftRight: | 2183 case UnlinkedExprOperation.bitShiftRight: |
| 2184 _computeBinaryExpressionType(TokenType.GT_GT); | 2184 _computeBinaryExpressionType(TokenType.GT_GT); |
| 2185 break; | 2185 break; |
| 2186 case UnlinkedConstOperation.bitShiftLeft: | 2186 case UnlinkedExprOperation.bitShiftLeft: |
| 2187 _computeBinaryExpressionType(TokenType.LT_LT); | 2187 _computeBinaryExpressionType(TokenType.LT_LT); |
| 2188 break; | 2188 break; |
| 2189 case UnlinkedConstOperation.add: | 2189 case UnlinkedExprOperation.add: |
| 2190 _computeBinaryExpressionType(TokenType.PLUS); | 2190 _computeBinaryExpressionType(TokenType.PLUS); |
| 2191 break; | 2191 break; |
| 2192 case UnlinkedConstOperation.subtract: | 2192 case UnlinkedExprOperation.subtract: |
| 2193 _computeBinaryExpressionType(TokenType.MINUS); | 2193 _computeBinaryExpressionType(TokenType.MINUS); |
| 2194 break; | 2194 break; |
| 2195 case UnlinkedConstOperation.multiply: | 2195 case UnlinkedExprOperation.multiply: |
| 2196 _computeBinaryExpressionType(TokenType.STAR); | 2196 _computeBinaryExpressionType(TokenType.STAR); |
| 2197 break; | 2197 break; |
| 2198 case UnlinkedConstOperation.divide: | 2198 case UnlinkedExprOperation.divide: |
| 2199 _computeBinaryExpressionType(TokenType.SLASH); | 2199 _computeBinaryExpressionType(TokenType.SLASH); |
| 2200 break; | 2200 break; |
| 2201 case UnlinkedConstOperation.floorDivide: | 2201 case UnlinkedExprOperation.floorDivide: |
| 2202 _computeBinaryExpressionType(TokenType.TILDE_SLASH); | 2202 _computeBinaryExpressionType(TokenType.TILDE_SLASH); |
| 2203 break; | 2203 break; |
| 2204 case UnlinkedConstOperation.greater: | 2204 case UnlinkedExprOperation.greater: |
| 2205 _computeBinaryExpressionType(TokenType.GT); | 2205 _computeBinaryExpressionType(TokenType.GT); |
| 2206 break; | 2206 break; |
| 2207 case UnlinkedConstOperation.less: | 2207 case UnlinkedExprOperation.less: |
| 2208 _computeBinaryExpressionType(TokenType.LT); | 2208 _computeBinaryExpressionType(TokenType.LT); |
| 2209 break; | 2209 break; |
| 2210 case UnlinkedConstOperation.greaterEqual: | 2210 case UnlinkedExprOperation.greaterEqual: |
| 2211 _computeBinaryExpressionType(TokenType.GT_EQ); | 2211 _computeBinaryExpressionType(TokenType.GT_EQ); |
| 2212 break; | 2212 break; |
| 2213 case UnlinkedConstOperation.lessEqual: | 2213 case UnlinkedExprOperation.lessEqual: |
| 2214 _computeBinaryExpressionType(TokenType.LT_EQ); | 2214 _computeBinaryExpressionType(TokenType.LT_EQ); |
| 2215 break; | 2215 break; |
| 2216 case UnlinkedConstOperation.modulo: | 2216 case UnlinkedExprOperation.modulo: |
| 2217 _computeBinaryExpressionType(TokenType.PERCENT); | 2217 _computeBinaryExpressionType(TokenType.PERCENT); |
| 2218 break; | 2218 break; |
| 2219 case UnlinkedConstOperation.conditional: | 2219 case UnlinkedExprOperation.conditional: |
| 2220 _doConditional(); | 2220 _doConditional(); |
| 2221 break; | 2221 break; |
| 2222 case UnlinkedConstOperation.assignToRef: | 2222 case UnlinkedExprOperation.assignToRef: |
| 2223 _doAssignToRef(); | 2223 _doAssignToRef(); |
| 2224 break; | 2224 break; |
| 2225 case UnlinkedConstOperation.assignToProperty: | 2225 case UnlinkedExprOperation.assignToProperty: |
| 2226 _doAssignToProperty(); | 2226 _doAssignToProperty(); |
| 2227 break; | 2227 break; |
| 2228 case UnlinkedConstOperation.assignToIndex: | 2228 case UnlinkedExprOperation.assignToIndex: |
| 2229 _doAssignToIndex(); | 2229 _doAssignToIndex(); |
| 2230 break; | 2230 break; |
| 2231 case UnlinkedConstOperation.extractIndex: | 2231 case UnlinkedExprOperation.extractIndex: |
| 2232 _doExtractIndex(); | 2232 _doExtractIndex(); |
| 2233 break; | 2233 break; |
| 2234 case UnlinkedConstOperation.invokeMethodRef: | 2234 case UnlinkedExprOperation.invokeMethodRef: |
| 2235 _doInvokeMethodRef(); | 2235 _doInvokeMethodRef(); |
| 2236 break; | 2236 break; |
| 2237 case UnlinkedConstOperation.invokeMethod: | 2237 case UnlinkedExprOperation.invokeMethod: |
| 2238 _doInvokeMethod(); | 2238 _doInvokeMethod(); |
| 2239 break; | 2239 break; |
| 2240 case UnlinkedConstOperation.cascadeSectionBegin: | 2240 case UnlinkedExprOperation.cascadeSectionBegin: |
| 2241 stack.add(stack.last); | 2241 stack.add(stack.last); |
| 2242 break; | 2242 break; |
| 2243 case UnlinkedConstOperation.cascadeSectionEnd: | 2243 case UnlinkedExprOperation.cascadeSectionEnd: |
| 2244 stack.removeLast(); | 2244 stack.removeLast(); |
| 2245 break; | 2245 break; |
| 2246 case UnlinkedConstOperation.typeCast: | 2246 case UnlinkedExprOperation.typeCast: |
| 2247 stack.removeLast(); | 2247 stack.removeLast(); |
| 2248 DartType type = _getNextTypeRef(); | 2248 DartType type = _getNextTypeRef(); |
| 2249 stack.add(type); | 2249 stack.add(type); |
| 2250 break; | 2250 break; |
| 2251 case UnlinkedConstOperation.typeCheck: | 2251 case UnlinkedExprOperation.typeCheck: |
| 2252 stack.removeLast(); | 2252 stack.removeLast(); |
| 2253 refPtr++; | 2253 refPtr++; |
| 2254 stack.add(typeProvider.boolType); | 2254 stack.add(typeProvider.boolType); |
| 2255 break; | 2255 break; |
| 2256 case UnlinkedConstOperation.throwException: | 2256 case UnlinkedExprOperation.throwException: |
| 2257 stack.removeLast(); | 2257 stack.removeLast(); |
| 2258 stack.add(BottomTypeImpl.instance); | 2258 stack.add(BottomTypeImpl.instance); |
| 2259 break; | 2259 break; |
| 2260 case UnlinkedConstOperation.pushLocalFunctionReference: | 2260 case UnlinkedExprOperation.pushLocalFunctionReference: |
| 2261 int popCount = _getNextInt(); | 2261 int popCount = _getNextInt(); |
| 2262 assert(popCount == 0); // TODO(paulberry): handle the nonzero case. | 2262 assert(popCount == 0); // TODO(paulberry): handle the nonzero case. |
| 2263 stack.add(function.functions[_getNextInt()].type); | 2263 stack.add(function.functions[_getNextInt()].type); |
| 2264 break; | 2264 break; |
| 2265 case UnlinkedConstOperation.pushParameter: | 2265 case UnlinkedExprOperation.pushParameter: |
| 2266 stack.add(_findParameterType(_getNextString())); | 2266 stack.add(_findParameterType(_getNextString())); |
| 2267 break; | 2267 break; |
| 2268 default: | 2268 default: |
| 2269 // TODO(paulberry): implement. | 2269 // TODO(paulberry): implement. |
| 2270 throw new UnimplementedError('$operation'); | 2270 throw new UnimplementedError('$operation'); |
| 2271 } | 2271 } |
| 2272 } | 2272 } |
| 2273 assert(intPtr == unlinkedConst.ints.length); | 2273 assert(intPtr == unlinkedConst.ints.length); |
| 2274 assert(refPtr == unlinkedConst.references.length); | 2274 assert(refPtr == unlinkedConst.references.length); |
| 2275 assert(strPtr == unlinkedConst.strings.length); | 2275 assert(strPtr == unlinkedConst.strings.length); |
| (...skipping 1720 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3996 @override | 3996 @override |
| 3997 void set inheritsCovariant(bool value) { | 3997 void set inheritsCovariant(bool value) { |
| 3998 _inheritsCovariant = value; | 3998 _inheritsCovariant = value; |
| 3999 } | 3999 } |
| 4000 | 4000 |
| 4001 @override | 4001 @override |
| 4002 bool get isCovariant { | 4002 bool get isCovariant { |
| 4003 if (inheritsCovariant) { | 4003 if (inheritsCovariant) { |
| 4004 return true; | 4004 return true; |
| 4005 } | 4005 } |
| 4006 for (UnlinkedConst annotation in _unlinkedParam.annotations) { | 4006 for (UnlinkedExpr annotation in _unlinkedParam.annotations) { |
| 4007 if (annotation.operations.length == 1 && | 4007 if (annotation.operations.length == 1 && |
| 4008 annotation.operations[0] == UnlinkedConstOperation.pushReference) { | 4008 annotation.operations[0] == UnlinkedExprOperation.pushReference) { |
| 4009 ReferenceableElementForLink element = | 4009 ReferenceableElementForLink element = |
| 4010 this.compilationUnit.resolveRef(annotation.references[0].reference); | 4010 this.compilationUnit.resolveRef(annotation.references[0].reference); |
| 4011 if (element is PropertyAccessorElementForLink && | 4011 if (element is PropertyAccessorElementForLink && |
| 4012 element.name == 'checked' && | 4012 element.name == 'checked' && |
| 4013 element.library.name == 'meta') { | 4013 element.library.name == 'meta') { |
| 4014 return true; | 4014 return true; |
| 4015 } | 4015 } |
| 4016 } | 4016 } |
| 4017 } | 4017 } |
| 4018 return false; | 4018 return false; |
| (...skipping 652 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4671 | 4671 |
| 4672 /** | 4672 /** |
| 4673 * Collect the type inference dependencies in [unlinkedExecutable] (which | 4673 * Collect the type inference dependencies in [unlinkedExecutable] (which |
| 4674 * should be interpreted relative to [compilationUnit]) and store them in | 4674 * should be interpreted relative to [compilationUnit]) and store them in |
| 4675 * [dependencies]. | 4675 * [dependencies]. |
| 4676 */ | 4676 */ |
| 4677 void collectDependencies( | 4677 void collectDependencies( |
| 4678 List<TypeInferenceNode> dependencies, | 4678 List<TypeInferenceNode> dependencies, |
| 4679 UnlinkedExecutable unlinkedExecutable, | 4679 UnlinkedExecutable unlinkedExecutable, |
| 4680 CompilationUnitElementForLink compilationUnit) { | 4680 CompilationUnitElementForLink compilationUnit) { |
| 4681 UnlinkedConst unlinkedConst = unlinkedExecutable?.bodyExpr; | 4681 UnlinkedExpr unlinkedConst = unlinkedExecutable?.bodyExpr; |
| 4682 if (unlinkedConst == null) { | 4682 if (unlinkedConst == null) { |
| 4683 return; | 4683 return; |
| 4684 } | 4684 } |
| 4685 int refPtr = 0; | 4685 int refPtr = 0; |
| 4686 int intPtr = 0; | 4686 int intPtr = 0; |
| 4687 | 4687 |
| 4688 for (UnlinkedConstOperation operation in unlinkedConst.operations) { | 4688 for (UnlinkedExprOperation operation in unlinkedConst.operations) { |
| 4689 switch (operation) { | 4689 switch (operation) { |
| 4690 case UnlinkedConstOperation.pushInt: | 4690 case UnlinkedExprOperation.pushInt: |
| 4691 intPtr++; | 4691 intPtr++; |
| 4692 break; | 4692 break; |
| 4693 case UnlinkedConstOperation.pushLongInt: | 4693 case UnlinkedExprOperation.pushLongInt: |
| 4694 int numInts = unlinkedConst.ints[intPtr++]; | 4694 int numInts = unlinkedConst.ints[intPtr++]; |
| 4695 intPtr += numInts; | 4695 intPtr += numInts; |
| 4696 break; | 4696 break; |
| 4697 case UnlinkedConstOperation.concatenate: | 4697 case UnlinkedExprOperation.concatenate: |
| 4698 intPtr++; | 4698 intPtr++; |
| 4699 break; | 4699 break; |
| 4700 case UnlinkedConstOperation.pushReference: | 4700 case UnlinkedExprOperation.pushReference: |
| 4701 EntityRef ref = unlinkedConst.references[refPtr++]; | 4701 EntityRef ref = unlinkedConst.references[refPtr++]; |
| 4702 // TODO(paulberry): cache these resolved references for | 4702 // TODO(paulberry): cache these resolved references for |
| 4703 // later use by evaluate(). | 4703 // later use by evaluate(). |
| 4704 TypeInferenceNode dependency = | 4704 TypeInferenceNode dependency = |
| 4705 compilationUnit.resolveRef(ref.reference).asTypeInferenceNode; | 4705 compilationUnit.resolveRef(ref.reference).asTypeInferenceNode; |
| 4706 if (dependency != null) { | 4706 if (dependency != null) { |
| 4707 dependencies.add(dependency); | 4707 dependencies.add(dependency); |
| 4708 } | 4708 } |
| 4709 break; | 4709 break; |
| 4710 case UnlinkedConstOperation.invokeConstructor: | 4710 case UnlinkedExprOperation.invokeConstructor: |
| 4711 refPtr++; | 4711 refPtr++; |
| 4712 intPtr += 2; | 4712 intPtr += 2; |
| 4713 break; | 4713 break; |
| 4714 case UnlinkedConstOperation.makeUntypedList: | 4714 case UnlinkedExprOperation.makeUntypedList: |
| 4715 case UnlinkedConstOperation.makeUntypedMap: | 4715 case UnlinkedExprOperation.makeUntypedMap: |
| 4716 intPtr++; | 4716 intPtr++; |
| 4717 break; | 4717 break; |
| 4718 case UnlinkedConstOperation.makeTypedList: | 4718 case UnlinkedExprOperation.makeTypedList: |
| 4719 refPtr++; | 4719 refPtr++; |
| 4720 intPtr++; | 4720 intPtr++; |
| 4721 break; | 4721 break; |
| 4722 case UnlinkedConstOperation.makeTypedMap: | 4722 case UnlinkedExprOperation.makeTypedMap: |
| 4723 refPtr += 2; | 4723 refPtr += 2; |
| 4724 intPtr++; | 4724 intPtr++; |
| 4725 break; | 4725 break; |
| 4726 case UnlinkedConstOperation.assignToRef: | 4726 case UnlinkedExprOperation.assignToRef: |
| 4727 // TODO(paulberry): if this reference refers to a variable, should it | 4727 // TODO(paulberry): if this reference refers to a variable, should it |
| 4728 // be considered a type inference dependency? | 4728 // be considered a type inference dependency? |
| 4729 refPtr++; | 4729 refPtr++; |
| 4730 break; | 4730 break; |
| 4731 case UnlinkedConstOperation.invokeMethodRef: | 4731 case UnlinkedExprOperation.invokeMethodRef: |
| 4732 // TODO(paulberry): if this reference refers to a variable, should it | 4732 // TODO(paulberry): if this reference refers to a variable, should it |
| 4733 // be considered a type inference dependency? | 4733 // be considered a type inference dependency? |
| 4734 refPtr++; | 4734 refPtr++; |
| 4735 intPtr += 2; | 4735 intPtr += 2; |
| 4736 int numTypeArguments = unlinkedConst.ints[intPtr++]; | 4736 int numTypeArguments = unlinkedConst.ints[intPtr++]; |
| 4737 refPtr += numTypeArguments; | 4737 refPtr += numTypeArguments; |
| 4738 break; | 4738 break; |
| 4739 case UnlinkedConstOperation.invokeMethod: | 4739 case UnlinkedExprOperation.invokeMethod: |
| 4740 intPtr += 2; | 4740 intPtr += 2; |
| 4741 int numTypeArguments = unlinkedConst.ints[intPtr++]; | 4741 int numTypeArguments = unlinkedConst.ints[intPtr++]; |
| 4742 refPtr += numTypeArguments; | 4742 refPtr += numTypeArguments; |
| 4743 break; | 4743 break; |
| 4744 case UnlinkedConstOperation.typeCast: | 4744 case UnlinkedExprOperation.typeCast: |
| 4745 case UnlinkedConstOperation.typeCheck: | 4745 case UnlinkedExprOperation.typeCheck: |
| 4746 refPtr++; | 4746 refPtr++; |
| 4747 break; | 4747 break; |
| 4748 case UnlinkedConstOperation.pushLocalFunctionReference: | 4748 case UnlinkedExprOperation.pushLocalFunctionReference: |
| 4749 int popCount = unlinkedConst.ints[intPtr++]; | 4749 int popCount = unlinkedConst.ints[intPtr++]; |
| 4750 assert(popCount == 0); // TODO(paulberry): handle the nonzero case. | 4750 assert(popCount == 0); // TODO(paulberry): handle the nonzero case. |
| 4751 dependencies.add(functionElement | 4751 dependencies.add(functionElement |
| 4752 .getLocalFunction(unlinkedConst.ints[intPtr++]) | 4752 .getLocalFunction(unlinkedConst.ints[intPtr++]) |
| 4753 .asTypeInferenceNode); | 4753 .asTypeInferenceNode); |
| 4754 break; | 4754 break; |
| 4755 default: | 4755 default: |
| 4756 break; | 4756 break; |
| 4757 } | 4757 } |
| 4758 } | 4758 } |
| (...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5079 * there are no type parameters in scope. | 5079 * there are no type parameters in scope. |
| 5080 */ | 5080 */ |
| 5081 TypeParameterizedElementMixin get _typeParameterContext; | 5081 TypeParameterizedElementMixin get _typeParameterContext; |
| 5082 | 5082 |
| 5083 @override | 5083 @override |
| 5084 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); | 5084 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
| 5085 | 5085 |
| 5086 @override | 5086 @override |
| 5087 String toString() => '$enclosingElement.$name'; | 5087 String toString() => '$enclosingElement.$name'; |
| 5088 } | 5088 } |
| OLD | NEW |