| OLD | NEW |
| 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2017, 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 import 'package:compiler/src/common.dart'; | 5 import 'package:compiler/src/common.dart'; |
| 6 import 'package:compiler/src/common_elements.dart'; |
| 6 import 'package:compiler/src/compiler.dart'; | 7 import 'package:compiler/src/compiler.dart'; |
| 7 import 'package:compiler/src/elements/elements.dart'; | 8 import 'package:compiler/src/elements/elements.dart'; |
| 9 import 'package:compiler/src/elements/entities.dart'; |
| 8 import 'package:compiler/src/resolution/tree_elements.dart'; | 10 import 'package:compiler/src/resolution/tree_elements.dart'; |
| 9 import 'package:compiler/src/tree/nodes.dart'; | 11 import 'package:compiler/src/tree/nodes.dart'; |
| 10 import 'package:compiler/src/types/types.dart'; | 12 import 'package:compiler/src/types/types.dart'; |
| 11 import 'package:expect/expect.dart'; | 13 import 'package:expect/expect.dart'; |
| 12 | 14 |
| 13 import '../annotated_code_helper.dart'; | 15 import '../annotated_code_helper.dart'; |
| 14 import '../memory_compiler.dart'; | 16 import '../memory_compiler.dart'; |
| 15 import 'enumerator.dart'; | 17 import 'enumerator.dart'; |
| 16 | 18 |
| 17 checkCode(String annotatedCode) async { | 19 typedef void CheckMemberFunction( |
| 20 Compiler compiler, Map<Id, String> expectedMap, MemberElement member); |
| 21 |
| 22 /// Compiles the [annotatedCode] with the provided [options] and calls |
| 23 /// [checkMember] for each member in the code providing the map from [Id] to |
| 24 /// annotation. Any [Id] left in the map will be reported as missing. |
| 25 checkCode(String annotatedCode, CheckMemberFunction checkMember, |
| 26 {List<String> options: const <String>[]}) async { |
| 18 AnnotatedCode code = new AnnotatedCode.fromText(annotatedCode, '/*', '*/'); | 27 AnnotatedCode code = new AnnotatedCode.fromText(annotatedCode, '/*', '*/'); |
| 19 Map<Id, String> expectedMap = computeExpectedMap(code); | 28 Map<Id, String> expectedMap = computeExpectedMap(code); |
| 20 Compiler compiler = | 29 Compiler compiler = compilerFor( |
| 21 compilerFor(memorySourceFiles: {'main.dart': code.sourceCode}); | 30 memorySourceFiles: {'main.dart': code.sourceCode}, options: options); |
| 22 compiler.stopAfterTypeInference = true; | 31 compiler.stopAfterTypeInference = true; |
| 23 Uri mainUri = Uri.parse('memory:main.dart'); | 32 Uri mainUri = Uri.parse('memory:main.dart'); |
| 24 await compiler.run(mainUri); | 33 await compiler.run(mainUri); |
| 25 compiler.mainApp.forEachLocalMember((member) { | 34 compiler.mainApp.forEachLocalMember((member) { |
| 26 if (member.isClass) { | 35 if (member.isClass) { |
| 27 member.forEachLocalMember((member) { | 36 member.forEachLocalMember((member) { |
| 28 checkMember(compiler, expectedMap, member); | 37 checkMember(compiler, expectedMap, member); |
| 29 }); | 38 }); |
| 30 } else if (member.isTypedef) { | 39 } else if (member.isTypedef) { |
| 31 // Skip. | 40 // Skip. |
| 32 } else { | 41 } else { |
| 33 checkMember(compiler, expectedMap, member); | 42 checkMember(compiler, expectedMap, member); |
| 34 } | 43 } |
| 35 }); | 44 }); |
| 36 expectedMap.forEach((NodeId id, String expected) { | 45 expectedMap.forEach((Id id, String expected) { |
| 37 reportHere( | 46 reportHere( |
| 38 compiler.reporter, | 47 compiler.reporter, |
| 39 new SourceSpan(mainUri, id.value, id.value + 1), | 48 computeSpannable(compiler.elementEnvironment, mainUri, id), |
| 40 'expected:${expected},actual:null'); | 49 'expected:${expected},actual:null'); |
| 41 }); | 50 }); |
| 51 Expect.isTrue(expectedMap.isEmpty, |
| 52 "Ids not found: $expectedMap."); |
| 42 } | 53 } |
| 43 | 54 |
| 44 void checkMember( | 55 void checkMemberAstTypeMasks( |
| 45 Compiler compiler, Map<Id, String> expectedMap, MemberElement member) { | 56 Compiler compiler, Map<Id, String> expectedMap, MemberElement member) { |
| 46 ResolvedAst resolvedAst = member.resolvedAst; | 57 ResolvedAst resolvedAst = member.resolvedAst; |
| 47 if (resolvedAst.kind != ResolvedAstKind.PARSED) return; | 58 if (resolvedAst.kind != ResolvedAstKind.PARSED) return; |
| 48 compiler.reporter.withCurrentElement(member.implementation, () { | 59 compiler.reporter.withCurrentElement(member.implementation, () { |
| 49 new TypeMaskChecker(compiler.reporter, expectedMap, resolvedAst, | 60 new TypeMaskChecker(compiler.reporter, expectedMap, resolvedAst, |
| 50 compiler.globalInference.results) | 61 compiler.globalInference.results) |
| 51 .check(); | 62 .check(); |
| 52 }); | 63 }); |
| 53 } | 64 } |
| 54 | 65 |
| 66 Spannable computeSpannable( |
| 67 ElementEnvironment elementEnvironment, Uri mainUri, Id id) { |
| 68 if (id is NodeId) { |
| 69 return new SourceSpan(mainUri, id.value, id.value + 1); |
| 70 } else if (id is ElementId) { |
| 71 LibraryEntity library = elementEnvironment.lookupLibrary(mainUri); |
| 72 if (id.className != null) { |
| 73 ClassEntity cls = |
| 74 elementEnvironment.lookupClass(library, id.className, required: true); |
| 75 return elementEnvironment.lookupClassMember(cls, id.memberName); |
| 76 } else { |
| 77 return elementEnvironment.lookupLibraryMember(library, id.memberName); |
| 78 } |
| 79 } |
| 80 throw new UnsupportedError('Unsupported id $id.'); |
| 81 } |
| 82 |
| 55 Map<Id, String> computeExpectedMap(AnnotatedCode code) { | 83 Map<Id, String> computeExpectedMap(AnnotatedCode code) { |
| 56 Map<Id, String> map = <Id, String>{}; | 84 Map<Id, String> map = <Id, String>{}; |
| 57 for (Annotation annotation in code.annotations) { | 85 for (Annotation annotation in code.annotations) { |
| 58 String text = annotation.text; | 86 String text = annotation.text; |
| 59 int colonPos = text.indexOf(':'); | 87 int colonPos = text.indexOf(':'); |
| 60 Id id; | 88 Id id; |
| 61 String expected; | 89 String expected; |
| 62 if (colonPos == -1) { | 90 if (colonPos == -1) { |
| 63 id = new NodeId(annotation.offset); | 91 id = new NodeId(annotation.offset); |
| 64 expected = text; | 92 expected = text; |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 144 visitSend(Send node) { | 172 visitSend(Send node) { |
| 145 checkSend(node); | 173 checkSend(node); |
| 146 visitNode(node); | 174 visitNode(node); |
| 147 } | 175 } |
| 148 | 176 |
| 149 visitSendSet(SendSet node) { | 177 visitSendSet(SendSet node) { |
| 150 checkSend(node); | 178 checkSend(node); |
| 151 visitNode(node); | 179 visitNode(node); |
| 152 } | 180 } |
| 153 } | 181 } |
| OLD | NEW |