| OLD | NEW | 
|---|
| 1 // Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file | 1 // Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file | 
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a | 
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. | 
| 4 | 4 | 
| 5 library summary_resynthesizer; | 5 library summary_resynthesizer; | 
| 6 | 6 | 
| 7 import 'package:analyzer/analyzer.dart'; | 7 import 'package:analyzer/analyzer.dart'; | 
| 8 import 'package:analyzer/src/generated/element.dart'; | 8 import 'package:analyzer/src/generated/element.dart'; | 
| 9 import 'package:analyzer/src/generated/element_handle.dart'; | 9 import 'package:analyzer/src/generated/element_handle.dart'; | 
| 10 import 'package:analyzer/src/generated/engine.dart'; | 10 import 'package:analyzer/src/generated/engine.dart'; | 
| (...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 239   void buildClass(UnlinkedClass serializedClass) { | 239   void buildClass(UnlinkedClass serializedClass) { | 
| 240     try { | 240     try { | 
| 241       currentTypeParameters = | 241       currentTypeParameters = | 
| 242           serializedClass.typeParameters.map(buildTypeParameter).toList(); | 242           serializedClass.typeParameters.map(buildTypeParameter).toList(); | 
| 243       for (int i = 0; i < serializedClass.typeParameters.length; i++) { | 243       for (int i = 0; i < serializedClass.typeParameters.length; i++) { | 
| 244         finishTypeParameter( | 244         finishTypeParameter( | 
| 245             serializedClass.typeParameters[i], currentTypeParameters[i]); | 245             serializedClass.typeParameters[i], currentTypeParameters[i]); | 
| 246       } | 246       } | 
| 247       ClassElementImpl classElement = | 247       ClassElementImpl classElement = | 
| 248           new ClassElementImpl(serializedClass.name, -1); | 248           new ClassElementImpl(serializedClass.name, -1); | 
| 249       if (serializedClass.isMixinApplication) { | 249       classElement.mixinApplication = serializedClass.isMixinApplication; | 
| 250         classElement.setModifier(Modifier.MIXIN_APPLICATION, true); |  | 
| 251       } |  | 
| 252       InterfaceTypeImpl correspondingType = new InterfaceTypeImpl(classElement); | 250       InterfaceTypeImpl correspondingType = new InterfaceTypeImpl(classElement); | 
| 253       if (serializedClass.supertype != null) { | 251       if (serializedClass.supertype != null) { | 
| 254         classElement.supertype = buildType(serializedClass.supertype); | 252         classElement.supertype = buildType(serializedClass.supertype); | 
| 255       } else { | 253       } else { | 
| 256         // TODO(paulberry): don't make Object point to itself. | 254         // TODO(paulberry): don't make Object point to itself. | 
| 257         classElement.supertype = summaryResynthesizer.typeProvider.objectType; | 255         classElement.supertype = summaryResynthesizer.typeProvider.objectType; | 
| 258       } | 256       } | 
| 259       classElement.interfaces = | 257       classElement.interfaces = | 
| 260           serializedClass.interfaces.map(buildType).toList(); | 258           serializedClass.interfaces.map(buildType).toList(); | 
| 261       classElement.mixins = serializedClass.mixins.map(buildType).toList(); | 259       classElement.mixins = serializedClass.mixins.map(buildType).toList(); | 
| (...skipping 15 matching lines...) Expand all  Loading... | 
| 277         } | 275         } | 
| 278       } | 276       } | 
| 279       for (UnlinkedVariable serializedVariable in serializedClass.fields) { | 277       for (UnlinkedVariable serializedVariable in serializedClass.fields) { | 
| 280         buildVariable(serializedVariable, memberHolder); | 278         buildVariable(serializedVariable, memberHolder); | 
| 281       } | 279       } | 
| 282       if (!serializedClass.isMixinApplication) { | 280       if (!serializedClass.isMixinApplication) { | 
| 283         if (!constructorFound) { | 281         if (!constructorFound) { | 
| 284           // Synthesize implicit constructors. | 282           // Synthesize implicit constructors. | 
| 285           ConstructorElementImpl constructor = | 283           ConstructorElementImpl constructor = | 
| 286               new ConstructorElementImpl('', -1); | 284               new ConstructorElementImpl('', -1); | 
| 287           constructor.setModifier(Modifier.SYNTHETIC, true); | 285           constructor.synthetic = true; | 
| 288           constructor.returnType = correspondingType; | 286           constructor.returnType = correspondingType; | 
| 289           constructor.type = new FunctionTypeImpl(constructor); | 287           constructor.type = new FunctionTypeImpl(constructor); | 
| 290           memberHolder.addConstructor(constructor); | 288           memberHolder.addConstructor(constructor); | 
| 291         } | 289         } | 
| 292         classElement.constructors = memberHolder.constructors; | 290         classElement.constructors = memberHolder.constructors; | 
| 293       } | 291       } | 
| 294       classElement.accessors = memberHolder.accessors; | 292       classElement.accessors = memberHolder.accessors; | 
| 295       classElement.fields = memberHolder.fields; | 293       classElement.fields = memberHolder.fields; | 
| 296       classElement.methods = memberHolder.methods; | 294       classElement.methods = memberHolder.methods; | 
| 297       correspondingType.typeArguments = | 295       correspondingType.typeArguments = | 
| (...skipping 26 matching lines...) Expand all  Loading... | 
| 324 | 322 | 
| 325   /** | 323   /** | 
| 326    * Resynthesize a [ConstructorElement] and place it in the given [holder]. | 324    * Resynthesize a [ConstructorElement] and place it in the given [holder]. | 
| 327    */ | 325    */ | 
| 328   void buildConstructor( | 326   void buildConstructor( | 
| 329       UnlinkedExecutable serializedExecutable, ElementHolder holder) { | 327       UnlinkedExecutable serializedExecutable, ElementHolder holder) { | 
| 330     assert(serializedExecutable.kind == UnlinkedExecutableKind.constructor); | 328     assert(serializedExecutable.kind == UnlinkedExecutableKind.constructor); | 
| 331     ConstructorElementImpl constructorElement = | 329     ConstructorElementImpl constructorElement = | 
| 332         new ConstructorElementImpl(serializedExecutable.name, -1); | 330         new ConstructorElementImpl(serializedExecutable.name, -1); | 
| 333     buildExecutableCommonParts(constructorElement, serializedExecutable); | 331     buildExecutableCommonParts(constructorElement, serializedExecutable); | 
| 334     if (serializedExecutable.isFactory) { | 332     constructorElement.factory = serializedExecutable.isFactory; | 
| 335       constructorElement.setModifier(Modifier.FACTORY, true); | 333     constructorElement.const2 = serializedExecutable.isConst; | 
| 336     } |  | 
| 337     if (serializedExecutable.isConst) { |  | 
| 338       constructorElement.setModifier(Modifier.CONST, true); |  | 
| 339     } |  | 
| 340     holder.addConstructor(constructorElement); | 334     holder.addConstructor(constructorElement); | 
| 341   } | 335   } | 
| 342 | 336 | 
| 343   /** | 337   /** | 
| 344    * Resynthesize the [ClassElement] corresponding to an enum, along with the | 338    * Resynthesize the [ClassElement] corresponding to an enum, along with the | 
| 345    * associated fields and implicit accessors. | 339    * associated fields and implicit accessors. | 
| 346    */ | 340    */ | 
| 347   void buildEnum(UnlinkedEnum serializedEnum) { | 341   void buildEnum(UnlinkedEnum serializedEnum) { | 
| 348     // TODO(paulberry): add offset support (for this element type and others) | 342     // TODO(paulberry): add offset support (for this element type and others) | 
| 349     ClassElementImpl classElement = | 343     ClassElementImpl classElement = | 
| 350         new ClassElementImpl(serializedEnum.name, -1); | 344         new ClassElementImpl(serializedEnum.name, -1); | 
| 351     classElement.setModifier(Modifier.ENUM, true); | 345     classElement.enum2 = true; | 
| 352     InterfaceType enumType = new InterfaceTypeImpl(classElement); | 346     InterfaceType enumType = new InterfaceTypeImpl(classElement); | 
| 353     classElement.type = enumType; | 347     classElement.type = enumType; | 
| 354     classElement.supertype = summaryResynthesizer.typeProvider.objectType; | 348     classElement.supertype = summaryResynthesizer.typeProvider.objectType; | 
| 355     ElementHolder memberHolder = new ElementHolder(); | 349     ElementHolder memberHolder = new ElementHolder(); | 
| 356     FieldElementImpl indexField = new FieldElementImpl('index', -1); | 350     FieldElementImpl indexField = new FieldElementImpl('index', -1); | 
| 357     indexField.setModifier(Modifier.FINAL, true); | 351     indexField.final2 = true; | 
| 358     indexField.setModifier(Modifier.SYNTHETIC, true); | 352     indexField.synthetic = true; | 
| 359     indexField.type = summaryResynthesizer.typeProvider.intType; | 353     indexField.type = summaryResynthesizer.typeProvider.intType; | 
| 360     memberHolder.addField(indexField); | 354     memberHolder.addField(indexField); | 
| 361     buildImplicitAccessors(indexField, memberHolder); | 355     buildImplicitAccessors(indexField, memberHolder); | 
| 362     FieldElementImpl valuesField = new ConstFieldElementImpl('values', -1); | 356     FieldElementImpl valuesField = new ConstFieldElementImpl('values', -1); | 
| 363     valuesField.setModifier(Modifier.SYNTHETIC, true); | 357     valuesField.synthetic = true; | 
| 364     valuesField.setModifier(Modifier.CONST, true); | 358     valuesField.const3 = true; | 
| 365     valuesField.setModifier(Modifier.STATIC, true); | 359     valuesField.static = true; | 
| 366     valuesField.type = summaryResynthesizer.typeProvider.listType | 360     valuesField.type = summaryResynthesizer.typeProvider.listType | 
| 367         .substitute4(<DartType>[enumType]); | 361         .substitute4(<DartType>[enumType]); | 
| 368     memberHolder.addField(valuesField); | 362     memberHolder.addField(valuesField); | 
| 369     buildImplicitAccessors(valuesField, memberHolder); | 363     buildImplicitAccessors(valuesField, memberHolder); | 
| 370     for (UnlinkedEnumValue serializedEnumValue in serializedEnum.values) { | 364     for (UnlinkedEnumValue serializedEnumValue in serializedEnum.values) { | 
| 371       ConstFieldElementImpl valueField = | 365       ConstFieldElementImpl valueField = | 
| 372           new ConstFieldElementImpl(serializedEnumValue.name, -1); | 366           new ConstFieldElementImpl(serializedEnumValue.name, -1); | 
| 373       valueField.setModifier(Modifier.CONST, true); | 367       valueField.const3 = true; | 
| 374       valueField.setModifier(Modifier.STATIC, true); | 368       valueField.static = true; | 
| 375       valueField.type = enumType; | 369       valueField.type = enumType; | 
| 376       memberHolder.addField(valueField); | 370       memberHolder.addField(valueField); | 
| 377       buildImplicitAccessors(valueField, memberHolder); | 371       buildImplicitAccessors(valueField, memberHolder); | 
| 378     } | 372     } | 
| 379     classElement.fields = memberHolder.fields; | 373     classElement.fields = memberHolder.fields; | 
| 380     classElement.accessors = memberHolder.accessors; | 374     classElement.accessors = memberHolder.accessors; | 
| 381     classElement.constructors = <ConstructorElement>[]; | 375     classElement.constructors = <ConstructorElement>[]; | 
| 382     unitHolder.addEnum(classElement); | 376     unitHolder.addEnum(classElement); | 
| 383   } | 377   } | 
| 384 | 378 | 
| (...skipping 14 matching lines...) Expand all  Loading... | 
| 399     switch (kind) { | 393     switch (kind) { | 
| 400       case UnlinkedExecutableKind.functionOrMethod: | 394       case UnlinkedExecutableKind.functionOrMethod: | 
| 401         if (isTopLevel) { | 395         if (isTopLevel) { | 
| 402           FunctionElementImpl executableElement = | 396           FunctionElementImpl executableElement = | 
| 403               new FunctionElementImpl(name, -1); | 397               new FunctionElementImpl(name, -1); | 
| 404           buildExecutableCommonParts(executableElement, serializedExecutable); | 398           buildExecutableCommonParts(executableElement, serializedExecutable); | 
| 405           holder.addFunction(executableElement); | 399           holder.addFunction(executableElement); | 
| 406         } else { | 400         } else { | 
| 407           MethodElementImpl executableElement = new MethodElementImpl(name, -1); | 401           MethodElementImpl executableElement = new MethodElementImpl(name, -1); | 
| 408           buildExecutableCommonParts(executableElement, serializedExecutable); | 402           buildExecutableCommonParts(executableElement, serializedExecutable); | 
| 409           executableElement.setModifier( | 403           executableElement.static = serializedExecutable.isStatic; | 
| 410               Modifier.STATIC, serializedExecutable.isStatic); |  | 
| 411           holder.addMethod(executableElement); | 404           holder.addMethod(executableElement); | 
| 412         } | 405         } | 
| 413         break; | 406         break; | 
| 414       case UnlinkedExecutableKind.getter: | 407       case UnlinkedExecutableKind.getter: | 
| 415       case UnlinkedExecutableKind.setter: | 408       case UnlinkedExecutableKind.setter: | 
| 416         PropertyAccessorElementImpl executableElement = | 409         PropertyAccessorElementImpl executableElement = | 
| 417             new PropertyAccessorElementImpl(name, -1); | 410             new PropertyAccessorElementImpl(name, -1); | 
| 418         if (isTopLevel) { | 411         if (isTopLevel) { | 
| 419           executableElement.setModifier(Modifier.STATIC, true); | 412           executableElement.static = true; | 
| 420         } else { | 413         } else { | 
| 421           executableElement.setModifier( | 414           executableElement.static = serializedExecutable.isStatic; | 
| 422               Modifier.STATIC, serializedExecutable.isStatic); |  | 
| 423         } | 415         } | 
| 424         buildExecutableCommonParts(executableElement, serializedExecutable); | 416         buildExecutableCommonParts(executableElement, serializedExecutable); | 
| 425         DartType type; | 417         DartType type; | 
| 426         if (kind == UnlinkedExecutableKind.getter) { | 418         if (kind == UnlinkedExecutableKind.getter) { | 
| 427           executableElement.setModifier(Modifier.GETTER, true); | 419           executableElement.getter = true; | 
| 428           type = executableElement.returnType; | 420           type = executableElement.returnType; | 
| 429         } else { | 421         } else { | 
| 430           executableElement.setModifier(Modifier.SETTER, true); | 422           executableElement.setter = true; | 
| 431           type = executableElement.parameters[0].type; | 423           type = executableElement.parameters[0].type; | 
| 432         } | 424         } | 
| 433         holder.addAccessor(executableElement); | 425         holder.addAccessor(executableElement); | 
| 434         // TODO(paulberry): consider removing implicit variables from the | 426         // TODO(paulberry): consider removing implicit variables from the | 
| 435         // element model; the spec doesn't call for them, and they cause | 427         // element model; the spec doesn't call for them, and they cause | 
| 436         // trouble when getters/setters exist in different parts. | 428         // trouble when getters/setters exist in different parts. | 
| 437         PropertyInducingElementImpl implicitVariable; | 429         PropertyInducingElementImpl implicitVariable; | 
| 438         if (isTopLevel) { | 430         if (isTopLevel) { | 
| 439           implicitVariable = buildImplicitTopLevelVariable(name, kind, holder); | 431           implicitVariable = buildImplicitTopLevelVariable(name, kind, holder); | 
| 440         } else { | 432         } else { | 
| 441           implicitVariable = buildImplicitField(name, type, kind, holder); | 433           FieldElementImpl field = buildImplicitField(name, type, kind, holder); | 
| 442           implicitVariable.setModifier( | 434           field.static = serializedExecutable.isStatic; | 
| 443               Modifier.STATIC, serializedExecutable.isStatic); | 435           implicitVariable = field; | 
| 444         } | 436         } | 
| 445         executableElement.variable = implicitVariable; | 437         executableElement.variable = implicitVariable; | 
| 446         if (kind == UnlinkedExecutableKind.getter) { | 438         if (kind == UnlinkedExecutableKind.getter) { | 
| 447           implicitVariable.getter = executableElement; | 439           implicitVariable.getter = executableElement; | 
| 448         } else { | 440         } else { | 
| 449           implicitVariable.setter = executableElement; | 441           implicitVariable.setter = executableElement; | 
| 450         } | 442         } | 
| 451         // TODO(paulberry): do the right thing when getter and setter are in | 443         // TODO(paulberry): do the right thing when getter and setter are in | 
| 452         // different units. | 444         // different units. | 
| 453         break; | 445         break; | 
| (...skipping 12 matching lines...) Expand all  Loading... | 
| 466   void buildExecutableCommonParts(ExecutableElementImpl executableElement, | 458   void buildExecutableCommonParts(ExecutableElementImpl executableElement, | 
| 467       UnlinkedExecutable serializedExecutable) { | 459       UnlinkedExecutable serializedExecutable) { | 
| 468     executableElement.parameters = | 460     executableElement.parameters = | 
| 469         serializedExecutable.parameters.map(buildParameter).toList(); | 461         serializedExecutable.parameters.map(buildParameter).toList(); | 
| 470     if (serializedExecutable.returnType != null) { | 462     if (serializedExecutable.returnType != null) { | 
| 471       executableElement.returnType = buildType(serializedExecutable.returnType); | 463       executableElement.returnType = buildType(serializedExecutable.returnType); | 
| 472     } else { | 464     } else { | 
| 473       executableElement.returnType = VoidTypeImpl.instance; | 465       executableElement.returnType = VoidTypeImpl.instance; | 
| 474     } | 466     } | 
| 475     executableElement.type = new FunctionTypeImpl(executableElement); | 467     executableElement.type = new FunctionTypeImpl(executableElement); | 
| 476     if (serializedExecutable.hasImplicitReturnType) { | 468     executableElement.hasImplicitReturnType = | 
| 477       executableElement.setModifier(Modifier.IMPLICIT_TYPE, true); | 469         serializedExecutable.hasImplicitReturnType; | 
| 478     } |  | 
| 479   } | 470   } | 
| 480 | 471 | 
| 481   /** | 472   /** | 
| 482    * Resynthesize an [ExportElement], | 473    * Resynthesize an [ExportElement], | 
| 483    */ | 474    */ | 
| 484   ExportElement buildExport(UnlinkedExport serializedExport) { | 475   ExportElement buildExport(UnlinkedExport serializedExport) { | 
| 485     ExportElementImpl exportElement = new ExportElementImpl(0); | 476     ExportElementImpl exportElement = new ExportElementImpl(0); | 
| 486     String exportedLibraryUri = summaryResynthesizer.sourceFactory | 477     String exportedLibraryUri = summaryResynthesizer.sourceFactory | 
| 487         .resolveUri(librarySource, serializedExport.uri) | 478         .resolveUri(librarySource, serializedExport.uri) | 
| 488         .uri | 479         .uri | 
| 489         .toString(); | 480         .toString(); | 
| 490     exportElement.exportedLibrary = new LibraryElementHandle( | 481     exportElement.exportedLibrary = new LibraryElementHandle( | 
| 491         summaryResynthesizer, | 482         summaryResynthesizer, | 
| 492         new ElementLocationImpl.con3(<String>[exportedLibraryUri])); | 483         new ElementLocationImpl.con3(<String>[exportedLibraryUri])); | 
| 493     exportElement.uri = serializedExport.uri; | 484     exportElement.uri = serializedExport.uri; | 
| 494     exportElement.combinators = | 485     exportElement.combinators = | 
| 495         serializedExport.combinators.map(buildCombinator).toList(); | 486         serializedExport.combinators.map(buildCombinator).toList(); | 
| 496     return exportElement; | 487     return exportElement; | 
| 497   } | 488   } | 
| 498 | 489 | 
| 499   /** | 490   /** | 
| 500    * Resynthesize a [FieldElement]. | 491    * Resynthesize a [FieldElement]. | 
| 501    */ | 492    */ | 
| 502   FieldElement buildField(UnlinkedVariable serializedField) { | 493   FieldElement buildField(UnlinkedVariable serializedField) { | 
| 503     FieldElementImpl fieldElement = | 494     FieldElementImpl fieldElement = | 
| 504         new FieldElementImpl(serializedField.name, -1); | 495         new FieldElementImpl(serializedField.name, -1); | 
| 505     fieldElement.type = buildType(serializedField.type); | 496     fieldElement.type = buildType(serializedField.type); | 
| 506     if (serializedField.isConst) { | 497     fieldElement.const3 = serializedField.isConst; | 
| 507       fieldElement.setModifier(Modifier.CONST, true); |  | 
| 508     } |  | 
| 509     return fieldElement; | 498     return fieldElement; | 
| 510   } | 499   } | 
| 511 | 500 | 
| 512   /** | 501   /** | 
| 513    * Build the implicit getter and setter associated with [element], and place | 502    * Build the implicit getter and setter associated with [element], and place | 
| 514    * them in [holder]. | 503    * them in [holder]. | 
| 515    */ | 504    */ | 
| 516   void buildImplicitAccessors( | 505   void buildImplicitAccessors( | 
| 517       PropertyInducingElementImpl element, ElementHolder holder) { | 506       PropertyInducingElementImpl element, ElementHolder holder) { | 
| 518     String name = element.name; | 507     String name = element.name; | 
| 519     DartType type = element.type; | 508     DartType type = element.type; | 
| 520     PropertyAccessorElementImpl getter = | 509     PropertyAccessorElementImpl getter = | 
| 521         new PropertyAccessorElementImpl(name, -1); | 510         new PropertyAccessorElementImpl(name, -1); | 
| 522     getter.setModifier(Modifier.GETTER, true); | 511     getter.getter = true; | 
| 523     getter.setModifier(Modifier.STATIC, element.isStatic); | 512     getter.static = element.isStatic; | 
| 524     getter.setModifier(Modifier.SYNTHETIC, true); | 513     getter.synthetic = true; | 
| 525     getter.returnType = type; | 514     getter.returnType = type; | 
| 526     getter.type = new FunctionTypeImpl(getter); | 515     getter.type = new FunctionTypeImpl(getter); | 
| 527     getter.variable = element; | 516     getter.variable = element; | 
| 528     holder.addAccessor(getter); | 517     holder.addAccessor(getter); | 
| 529     element.getter = getter; | 518     element.getter = getter; | 
| 530     if (!(element.isConst || element.isFinal)) { | 519     if (!(element.isConst || element.isFinal)) { | 
| 531       PropertyAccessorElementImpl setter = | 520       PropertyAccessorElementImpl setter = | 
| 532           new PropertyAccessorElementImpl(name, -1); | 521           new PropertyAccessorElementImpl(name, -1); | 
| 533       setter.setModifier(Modifier.SETTER, true); | 522       setter.setter = true; | 
| 534       setter.setModifier(Modifier.STATIC, element.isStatic); | 523       setter.static = element.isStatic; | 
| 535       setter.setModifier(Modifier.SYNTHETIC, true); | 524       setter.synthetic = true; | 
| 536       setter.parameters = <ParameterElement>[ | 525       setter.parameters = <ParameterElement>[ | 
| 537         new ParameterElementImpl('_$name', -1) | 526         new ParameterElementImpl('_$name', -1) | 
| 538           ..setModifier(Modifier.SYNTHETIC, true) | 527           ..synthetic = true | 
| 539           ..type = type | 528           ..type = type | 
| 540           ..parameterKind = ParameterKind.REQUIRED | 529           ..parameterKind = ParameterKind.REQUIRED | 
| 541       ]; | 530       ]; | 
| 542       setter.returnType = VoidTypeImpl.instance; | 531       setter.returnType = VoidTypeImpl.instance; | 
| 543       setter.type = new FunctionTypeImpl(setter); | 532       setter.type = new FunctionTypeImpl(setter); | 
| 544       setter.variable = element; | 533       setter.variable = element; | 
| 545       holder.addAccessor(setter); | 534       holder.addAccessor(setter); | 
| 546       element.setter = setter; | 535       element.setter = setter; | 
| 547     } | 536     } | 
| 548   } | 537   } | 
| 549 | 538 | 
| 550   /** | 539   /** | 
| 551    * Build the implicit field associated with a getter or setter, and place it | 540    * Build the implicit field associated with a getter or setter, and place it | 
| 552    * in [holder]. | 541    * in [holder]. | 
| 553    */ | 542    */ | 
| 554   PropertyInducingElementImpl buildImplicitField(String name, DartType type, | 543   FieldElementImpl buildImplicitField(String name, DartType type, | 
| 555       UnlinkedExecutableKind kind, ElementHolder holder) { | 544       UnlinkedExecutableKind kind, ElementHolder holder) { | 
| 556     if (holder.getField(name) == null) { | 545     if (holder.getField(name) == null) { | 
| 557       FieldElementImpl field = new FieldElementImpl(name, -1); | 546       FieldElementImpl field = new FieldElementImpl(name, -1); | 
| 558       field.setModifier(Modifier.SYNTHETIC, true); | 547       field.synthetic = true; | 
| 559       if (kind == UnlinkedExecutableKind.getter) { | 548       field.final2 = kind == UnlinkedExecutableKind.getter; | 
| 560         field.setModifier(Modifier.FINAL, true); |  | 
| 561       } |  | 
| 562       field.type = type; | 549       field.type = type; | 
| 563       holder.addField(field); | 550       holder.addField(field); | 
| 564       return field; | 551       return field; | 
| 565     } else { | 552     } else { | 
| 566       // TODO(paulberry): if adding a setter where there was previously | 553       // TODO(paulberry): if adding a setter where there was previously | 
| 567       // only a getter, remove "final" modifier. | 554       // only a getter, remove "final" modifier. | 
| 568       // TODO(paulberry): what if the getter and setter have a type mismatch? | 555       // TODO(paulberry): what if the getter and setter have a type mismatch? | 
| 569       throw new UnimplementedError(); | 556       throw new UnimplementedError(); | 
| 570     } | 557     } | 
| 571   } | 558   } | 
| 572 | 559 | 
| 573   /** | 560   /** | 
| 574    * Build the implicit top level variable associated with a getter or setter, | 561    * Build the implicit top level variable associated with a getter or setter, | 
| 575    * and place it in [holder]. | 562    * and place it in [holder]. | 
| 576    */ | 563    */ | 
| 577   PropertyInducingElementImpl buildImplicitTopLevelVariable( | 564   PropertyInducingElementImpl buildImplicitTopLevelVariable( | 
| 578       String name, UnlinkedExecutableKind kind, ElementHolder holder) { | 565       String name, UnlinkedExecutableKind kind, ElementHolder holder) { | 
| 579     if (holder.getTopLevelVariable(name) == null) { | 566     if (holder.getTopLevelVariable(name) == null) { | 
| 580       TopLevelVariableElementImpl variable = | 567       TopLevelVariableElementImpl variable = | 
| 581           new TopLevelVariableElementImpl(name, -1); | 568           new TopLevelVariableElementImpl(name, -1); | 
| 582       variable.setModifier(Modifier.SYNTHETIC, true); | 569       variable.synthetic = true; | 
| 583       if (kind == UnlinkedExecutableKind.getter) { | 570       variable.final2 = kind == UnlinkedExecutableKind.getter; | 
| 584         variable.setModifier(Modifier.FINAL, true); |  | 
| 585       } |  | 
| 586       holder.addTopLevelVariable(variable); | 571       holder.addTopLevelVariable(variable); | 
| 587       return variable; | 572       return variable; | 
| 588     } else { | 573     } else { | 
| 589       // TODO(paulberry): if adding a setter where there was previously | 574       // TODO(paulberry): if adding a setter where there was previously | 
| 590       // only a getter, remove "final" modifier. | 575       // only a getter, remove "final" modifier. | 
| 591       // TODO(paulberry): what if the getter and setter have a type mismatch? | 576       // TODO(paulberry): what if the getter and setter have a type mismatch? | 
| 592       throw new UnimplementedError(); | 577       throw new UnimplementedError(); | 
| 593     } | 578     } | 
| 594   } | 579   } | 
| 595 | 580 | 
| 596   /** | 581   /** | 
| 597    * Resynthesize an [ImportElement]. | 582    * Resynthesize an [ImportElement]. | 
| 598    */ | 583    */ | 
| 599   ImportElement buildImport(UnlinkedImport serializedImport, int dependency) { | 584   ImportElement buildImport(UnlinkedImport serializedImport, int dependency) { | 
| 600     bool isSynthetic = serializedImport.isImplicit; | 585     bool isSynthetic = serializedImport.isImplicit; | 
| 601     // TODO(paulberry): it seems problematic for the offset to be 0 for | 586     // TODO(paulberry): it seems problematic for the offset to be 0 for | 
| 602     // non-synthetic imports, since it is used to disambiguate location. | 587     // non-synthetic imports, since it is used to disambiguate location. | 
| 603     ImportElementImpl importElement = | 588     ImportElementImpl importElement = | 
| 604         new ImportElementImpl(isSynthetic ? -1 : serializedImport.offset); | 589         new ImportElementImpl(isSynthetic ? -1 : serializedImport.offset); | 
| 605     String absoluteUri = summaryResynthesizer.sourceFactory | 590     String absoluteUri = summaryResynthesizer.sourceFactory | 
| 606         .resolveUri( | 591         .resolveUri( | 
| 607             librarySource, prelinkedLibrary.dependencies[dependency].uri) | 592             librarySource, prelinkedLibrary.dependencies[dependency].uri) | 
| 608         .uri | 593         .uri | 
| 609         .toString(); | 594         .toString(); | 
| 610     importElement.importedLibrary = new LibraryElementHandle( | 595     importElement.importedLibrary = new LibraryElementHandle( | 
| 611         summaryResynthesizer, | 596         summaryResynthesizer, | 
| 612         new ElementLocationImpl.con3(<String>[absoluteUri])); | 597         new ElementLocationImpl.con3(<String>[absoluteUri])); | 
| 613     if (isSynthetic) { | 598     if (isSynthetic) { | 
| 614       importElement.setModifier(Modifier.SYNTHETIC, true); | 599       importElement.synthetic = true; | 
| 615     } else { | 600     } else { | 
| 616       importElement.uri = serializedImport.uri; | 601       importElement.uri = serializedImport.uri; | 
| 617     } | 602     } | 
| 618     if (serializedImport.prefixReference != 0) { | 603     if (serializedImport.prefixReference != 0) { | 
| 619       UnlinkedReference serializedPrefix = prelinkedLibrary.units[0] | 604       UnlinkedReference serializedPrefix = prelinkedLibrary.units[0] | 
| 620           .unlinked | 605           .unlinked | 
| 621           .references[serializedImport.prefixReference]; | 606           .references[serializedImport.prefixReference]; | 
| 622       importElement.prefix = new PrefixElementImpl(serializedPrefix.name, -1); | 607       importElement.prefix = new PrefixElementImpl(serializedPrefix.name, -1); | 
| 623     } | 608     } | 
| 624     importElement.combinators = | 609     importElement.combinators = | 
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 669 | 654 | 
| 670   /** | 655   /** | 
| 671    * Resynthesize a [ParameterElement]. | 656    * Resynthesize a [ParameterElement]. | 
| 672    */ | 657    */ | 
| 673   ParameterElement buildParameter(UnlinkedParam serializedParameter) { | 658   ParameterElement buildParameter(UnlinkedParam serializedParameter) { | 
| 674     ParameterElementImpl parameterElement = | 659     ParameterElementImpl parameterElement = | 
| 675         new ParameterElementImpl(serializedParameter.name, -1); | 660         new ParameterElementImpl(serializedParameter.name, -1); | 
| 676     if (serializedParameter.isFunctionTyped) { | 661     if (serializedParameter.isFunctionTyped) { | 
| 677       FunctionElementImpl parameterTypeElement = | 662       FunctionElementImpl parameterTypeElement = | 
| 678           new FunctionElementImpl('', -1); | 663           new FunctionElementImpl('', -1); | 
| 679       parameterTypeElement.setModifier(Modifier.SYNTHETIC, true); | 664       parameterTypeElement.synthetic = true; | 
| 680       parameterElement.parameters = | 665       parameterElement.parameters = | 
| 681           serializedParameter.parameters.map(buildParameter).toList(); | 666           serializedParameter.parameters.map(buildParameter).toList(); | 
| 682       parameterTypeElement.enclosingElement = parameterElement; | 667       parameterTypeElement.enclosingElement = parameterElement; | 
| 683       parameterTypeElement.shareParameters(parameterElement.parameters); | 668       parameterTypeElement.shareParameters(parameterElement.parameters); | 
| 684       if (serializedParameter.type != null) { | 669       if (serializedParameter.type != null) { | 
| 685         parameterTypeElement.returnType = buildType(serializedParameter.type); | 670         parameterTypeElement.returnType = buildType(serializedParameter.type); | 
| 686       } else { | 671       } else { | 
| 687         parameterTypeElement.returnType = VoidTypeImpl.instance; | 672         parameterTypeElement.returnType = VoidTypeImpl.instance; | 
| 688       } | 673       } | 
| 689       parameterElement.type = new FunctionTypeImpl(parameterTypeElement); | 674       parameterElement.type = new FunctionTypeImpl(parameterTypeElement); | 
| 690     } else { | 675     } else { | 
| 691       parameterElement.type = buildType(serializedParameter.type); | 676       parameterElement.type = buildType(serializedParameter.type); | 
| 692       if (serializedParameter.hasImplicitType) { | 677       parameterElement.hasImplicitType = serializedParameter.hasImplicitType; | 
| 693         parameterElement.setModifier(Modifier.IMPLICIT_TYPE, true); |  | 
| 694       } |  | 
| 695     } | 678     } | 
| 696     switch (serializedParameter.kind) { | 679     switch (serializedParameter.kind) { | 
| 697       case UnlinkedParamKind.named: | 680       case UnlinkedParamKind.named: | 
| 698         parameterElement.parameterKind = ParameterKind.NAMED; | 681         parameterElement.parameterKind = ParameterKind.NAMED; | 
| 699         break; | 682         break; | 
| 700       case UnlinkedParamKind.positional: | 683       case UnlinkedParamKind.positional: | 
| 701         parameterElement.parameterKind = ParameterKind.POSITIONAL; | 684         parameterElement.parameterKind = ParameterKind.POSITIONAL; | 
| 702         break; | 685         break; | 
| 703       case UnlinkedParamKind.required: | 686       case UnlinkedParamKind.required: | 
| 704         parameterElement.parameterKind = ParameterKind.REQUIRED; | 687         parameterElement.parameterKind = ParameterKind.REQUIRED; | 
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 867     if (holder == null) { | 850     if (holder == null) { | 
| 868       TopLevelVariableElementImpl element = | 851       TopLevelVariableElementImpl element = | 
| 869           new TopLevelVariableElementImpl(serializedVariable.name, -1); | 852           new TopLevelVariableElementImpl(serializedVariable.name, -1); | 
| 870       buildVariableCommonParts(element, serializedVariable); | 853       buildVariableCommonParts(element, serializedVariable); | 
| 871       unitHolder.addTopLevelVariable(element); | 854       unitHolder.addTopLevelVariable(element); | 
| 872       buildImplicitAccessors(element, unitHolder); | 855       buildImplicitAccessors(element, unitHolder); | 
| 873     } else { | 856     } else { | 
| 874       FieldElementImpl element = | 857       FieldElementImpl element = | 
| 875           new FieldElementImpl(serializedVariable.name, -1); | 858           new FieldElementImpl(serializedVariable.name, -1); | 
| 876       buildVariableCommonParts(element, serializedVariable); | 859       buildVariableCommonParts(element, serializedVariable); | 
|  | 860       element.static = serializedVariable.isStatic; | 
| 877       holder.addField(element); | 861       holder.addField(element); | 
| 878       buildImplicitAccessors(element, holder); | 862       buildImplicitAccessors(element, holder); | 
| 879     } | 863     } | 
| 880   } | 864   } | 
| 881 | 865 | 
| 882   /** | 866   /** | 
| 883    * Handle the parts that are common to top level variables and fields. | 867    * Handle the parts that are common to top level variables and fields. | 
| 884    */ | 868    */ | 
| 885   void buildVariableCommonParts(PropertyInducingElementImpl element, | 869   void buildVariableCommonParts(PropertyInducingElementImpl element, | 
| 886       UnlinkedVariable serializedVariable) { | 870       UnlinkedVariable serializedVariable) { | 
| 887     element.type = buildType(serializedVariable.type); | 871     element.type = buildType(serializedVariable.type); | 
| 888     element.setModifier(Modifier.CONST, serializedVariable.isConst); | 872     element.const3 = serializedVariable.isConst; | 
| 889     element.setModifier(Modifier.STATIC, serializedVariable.isStatic); |  | 
| 890   } | 873   } | 
| 891 | 874 | 
| 892   /** | 875   /** | 
| 893    * Finish creating a [TypeParameterElement] by deserializing its bound. | 876    * Finish creating a [TypeParameterElement] by deserializing its bound. | 
| 894    */ | 877    */ | 
| 895   void finishTypeParameter(UnlinkedTypeParam serializedTypeParameter, | 878   void finishTypeParameter(UnlinkedTypeParam serializedTypeParameter, | 
| 896       TypeParameterElementImpl typeParameterElement) { | 879       TypeParameterElementImpl typeParameterElement) { | 
| 897     if (serializedTypeParameter.bound != null) { | 880     if (serializedTypeParameter.bound != null) { | 
| 898       typeParameterElement.bound = buildType(serializedTypeParameter.bound); | 881       typeParameterElement.bound = buildType(serializedTypeParameter.bound); | 
| 899     } | 882     } | 
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 933       elementMap[cls.name] = cls; | 916       elementMap[cls.name] = cls; | 
| 934     } | 917     } | 
| 935     for (FunctionTypeAliasElement typeAlias in unit.functionTypeAliases) { | 918     for (FunctionTypeAliasElement typeAlias in unit.functionTypeAliases) { | 
| 936       elementMap[typeAlias.name] = typeAlias; | 919       elementMap[typeAlias.name] = typeAlias; | 
| 937     } | 920     } | 
| 938     resummarizedElements[absoluteUri] = elementMap; | 921     resummarizedElements[absoluteUri] = elementMap; | 
| 939     unitHolder = null; | 922     unitHolder = null; | 
| 940     prelinkedUnit = null; | 923     prelinkedUnit = null; | 
| 941   } | 924   } | 
| 942 } | 925 } | 
| OLD | NEW | 
|---|