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 library analyzer.test.generated.element_resolver_test; | 5 library analyzer.test.generated.element_resolver_test; |
6 | 6 |
7 import 'package:analyzer/dart/ast/ast.dart'; | 7 import 'package:analyzer/dart/ast/ast.dart'; |
| 8 import 'package:analyzer/dart/ast/resolution_accessors.dart'; |
8 import 'package:analyzer/dart/ast/standard_ast_factory.dart'; | 9 import 'package:analyzer/dart/ast/standard_ast_factory.dart'; |
9 import 'package:analyzer/dart/ast/token.dart'; | 10 import 'package:analyzer/dart/ast/token.dart'; |
10 import 'package:analyzer/dart/element/element.dart'; | 11 import 'package:analyzer/dart/element/element.dart'; |
11 import 'package:analyzer/dart/element/type.dart'; | 12 import 'package:analyzer/dart/element/type.dart'; |
12 import 'package:analyzer/file_system/memory_file_system.dart'; | 13 import 'package:analyzer/file_system/memory_file_system.dart'; |
13 import 'package:analyzer/src/dart/element/element.dart'; | 14 import 'package:analyzer/src/dart/element/element.dart'; |
14 import 'package:analyzer/src/generated/element_resolver.dart'; | 15 import 'package:analyzer/src/generated/element_resolver.dart'; |
15 import 'package:analyzer/src/generated/engine.dart'; | 16 import 'package:analyzer/src/generated/engine.dart'; |
16 import 'package:analyzer/src/generated/resolver.dart'; | 17 import 'package:analyzer/src/generated/resolver.dart'; |
17 import 'package:analyzer/src/generated/source.dart'; | 18 import 'package:analyzer/src/generated/source.dart'; |
(...skipping 24 matching lines...) Expand all Loading... |
42 class A { | 43 class A { |
43 const A.named(); | 44 const A.named(); |
44 } | 45 } |
45 '''); | 46 '''); |
46 _validateAnnotation('', '@A.named()', (SimpleIdentifier name1, | 47 _validateAnnotation('', '@A.named()', (SimpleIdentifier name1, |
47 SimpleIdentifier name2, | 48 SimpleIdentifier name2, |
48 SimpleIdentifier name3, | 49 SimpleIdentifier name3, |
49 Element annotationElement) { | 50 Element annotationElement) { |
50 expect(name1, isNotNull); | 51 expect(name1, isNotNull); |
51 expect(name1.staticElement, new isInstanceOf<ClassElement>()); | 52 expect(name1.staticElement, new isInstanceOf<ClassElement>()); |
52 expect(name1.staticElement.displayName, 'A'); | 53 expect(staticElementForIdentifier(name1).displayName, 'A'); |
53 expect(name2, isNotNull); | 54 expect(name2, isNotNull); |
54 expect(name2.staticElement, new isInstanceOf<ConstructorElement>()); | 55 expect(name2.staticElement, new isInstanceOf<ConstructorElement>()); |
55 expect(name2.staticElement.displayName, 'named'); | 56 expect(staticElementForIdentifier(name2).displayName, 'named'); |
56 expect(name3, isNull); | 57 expect(name3, isNull); |
57 if (annotationElement is ConstructorElement) { | 58 if (annotationElement is ConstructorElement) { |
58 expect(annotationElement, same(name2.staticElement)); | 59 expect(annotationElement, same(name2.staticElement)); |
59 expect(annotationElement.enclosingElement, name1.staticElement); | 60 expect(annotationElement.enclosingElement, name1.staticElement); |
60 expect(annotationElement.displayName, 'named'); | 61 expect(annotationElement.displayName, 'named'); |
61 expect(annotationElement.parameters, isEmpty); | 62 expect(annotationElement.parameters, isEmpty); |
62 } else { | 63 } else { |
63 fail('Expected "annotationElement" is ConstructorElement, ' | 64 fail('Expected "annotationElement" is ConstructorElement, ' |
64 'but (${annotationElement?.runtimeType}) $annotationElement found.')
; | 65 'but (${annotationElement?.runtimeType}) $annotationElement found.')
; |
65 } | 66 } |
66 }); | 67 }); |
67 } | 68 } |
68 | 69 |
69 void test_annotation_class_prefixed_namedConstructor() { | 70 void test_annotation_class_prefixed_namedConstructor() { |
70 addNamedSource( | 71 addNamedSource( |
71 '/a.dart', | 72 '/a.dart', |
72 r''' | 73 r''' |
73 class A { | 74 class A { |
74 const A.named(); | 75 const A.named(); |
75 } | 76 } |
76 '''); | 77 '''); |
77 _validateAnnotation('as p', '@p.A.named()', (SimpleIdentifier name1, | 78 _validateAnnotation('as p', '@p.A.named()', (SimpleIdentifier name1, |
78 SimpleIdentifier name2, | 79 SimpleIdentifier name2, |
79 SimpleIdentifier name3, | 80 SimpleIdentifier name3, |
80 Element annotationElement) { | 81 Element annotationElement) { |
81 expect(name1, isNotNull); | 82 expect(name1, isNotNull); |
82 expect(name1.staticElement, new isInstanceOf<PrefixElement>()); | 83 expect(name1.staticElement, new isInstanceOf<PrefixElement>()); |
83 expect(name1.staticElement.displayName, 'p'); | 84 expect(staticElementForIdentifier(name1).displayName, 'p'); |
84 expect(name2, isNotNull); | 85 expect(name2, isNotNull); |
85 expect(name2.staticElement, new isInstanceOf<ClassElement>()); | 86 expect(name2.staticElement, new isInstanceOf<ClassElement>()); |
86 expect(name2.staticElement.displayName, 'A'); | 87 expect(staticElementForIdentifier(name2).displayName, 'A'); |
87 expect(name3, isNotNull); | 88 expect(name3, isNotNull); |
88 expect(name3.staticElement, new isInstanceOf<ConstructorElement>()); | 89 expect(name3.staticElement, new isInstanceOf<ConstructorElement>()); |
89 expect(name3.staticElement.displayName, 'named'); | 90 expect(staticElementForIdentifier(name3).displayName, 'named'); |
90 if (annotationElement is ConstructorElement) { | 91 if (annotationElement is ConstructorElement) { |
91 expect(annotationElement, same(name3.staticElement)); | 92 expect(annotationElement, same(name3.staticElement)); |
92 expect(annotationElement.enclosingElement, name2.staticElement); | 93 expect(annotationElement.enclosingElement, name2.staticElement); |
93 expect(annotationElement.displayName, 'named'); | 94 expect(annotationElement.displayName, 'named'); |
94 expect(annotationElement.parameters, isEmpty); | 95 expect(annotationElement.parameters, isEmpty); |
95 } else { | 96 } else { |
96 fail('Expected "annotationElement" is ConstructorElement, ' | 97 fail('Expected "annotationElement" is ConstructorElement, ' |
97 'but (${annotationElement?.runtimeType}) $annotationElement found.')
; | 98 'but (${annotationElement?.runtimeType}) $annotationElement found.')
; |
98 } | 99 } |
99 }); | 100 }); |
100 } | 101 } |
101 | 102 |
102 void test_annotation_class_prefixed_staticConstField() { | 103 void test_annotation_class_prefixed_staticConstField() { |
103 addNamedSource( | 104 addNamedSource( |
104 '/a.dart', | 105 '/a.dart', |
105 r''' | 106 r''' |
106 class A { | 107 class A { |
107 static const V = 0; | 108 static const V = 0; |
108 } | 109 } |
109 '''); | 110 '''); |
110 _validateAnnotation('as p', '@p.A.V', (SimpleIdentifier name1, | 111 _validateAnnotation('as p', '@p.A.V', (SimpleIdentifier name1, |
111 SimpleIdentifier name2, | 112 SimpleIdentifier name2, |
112 SimpleIdentifier name3, | 113 SimpleIdentifier name3, |
113 Element annotationElement) { | 114 Element annotationElement) { |
114 expect(name1, isNotNull); | 115 expect(name1, isNotNull); |
115 expect(name1.staticElement, new isInstanceOf<PrefixElement>()); | 116 expect(name1.staticElement, new isInstanceOf<PrefixElement>()); |
116 expect(name1.staticElement.displayName, 'p'); | 117 expect(staticElementForIdentifier(name1).displayName, 'p'); |
117 expect(name2, isNotNull); | 118 expect(name2, isNotNull); |
118 expect(name2.staticElement, new isInstanceOf<ClassElement>()); | 119 expect(name2.staticElement, new isInstanceOf<ClassElement>()); |
119 expect(name2.staticElement.displayName, 'A'); | 120 expect(staticElementForIdentifier(name2).displayName, 'A'); |
120 expect(name3, isNotNull); | 121 expect(name3, isNotNull); |
121 expect(name3.staticElement, new isInstanceOf<PropertyAccessorElement>()); | 122 expect(name3.staticElement, new isInstanceOf<PropertyAccessorElement>()); |
122 expect(name3.staticElement.displayName, 'V'); | 123 expect(staticElementForIdentifier(name3).displayName, 'V'); |
123 if (annotationElement is PropertyAccessorElement) { | 124 if (annotationElement is PropertyAccessorElement) { |
124 expect(annotationElement, same(name3.staticElement)); | 125 expect(annotationElement, same(name3.staticElement)); |
125 expect(annotationElement.enclosingElement, name2.staticElement); | 126 expect(annotationElement.enclosingElement, name2.staticElement); |
126 expect(annotationElement.displayName, 'V'); | 127 expect(annotationElement.displayName, 'V'); |
127 } else { | 128 } else { |
128 fail('Expected "annotationElement" is PropertyAccessorElement, ' | 129 fail('Expected "annotationElement" is PropertyAccessorElement, ' |
129 'but (${annotationElement?.runtimeType}) $annotationElement found.')
; | 130 'but (${annotationElement?.runtimeType}) $annotationElement found.')
; |
130 } | 131 } |
131 }); | 132 }); |
132 } | 133 } |
133 | 134 |
134 void test_annotation_class_prefixed_unnamedConstructor() { | 135 void test_annotation_class_prefixed_unnamedConstructor() { |
135 addNamedSource( | 136 addNamedSource( |
136 '/a.dart', | 137 '/a.dart', |
137 r''' | 138 r''' |
138 class A { | 139 class A { |
139 const A(); | 140 const A(); |
140 } | 141 } |
141 '''); | 142 '''); |
142 _validateAnnotation('as p', '@p.A', (SimpleIdentifier name1, | 143 _validateAnnotation('as p', '@p.A', (SimpleIdentifier name1, |
143 SimpleIdentifier name2, | 144 SimpleIdentifier name2, |
144 SimpleIdentifier name3, | 145 SimpleIdentifier name3, |
145 Element annotationElement) { | 146 Element annotationElement) { |
146 expect(name1, isNotNull); | 147 expect(name1, isNotNull); |
147 expect(name1.staticElement, new isInstanceOf<PrefixElement>()); | 148 expect(name1.staticElement, new isInstanceOf<PrefixElement>()); |
148 expect(name1.staticElement.displayName, 'p'); | 149 expect(staticElementForIdentifier(name1).displayName, 'p'); |
149 expect(name2, isNotNull); | 150 expect(name2, isNotNull); |
150 expect(name2.staticElement, new isInstanceOf<ClassElement>()); | 151 expect(name2.staticElement, new isInstanceOf<ClassElement>()); |
151 expect(name2.staticElement.displayName, 'A'); | 152 expect(staticElementForIdentifier(name2).displayName, 'A'); |
152 expect(name3, isNull); | 153 expect(name3, isNull); |
153 if (annotationElement is ConstructorElement) { | 154 if (annotationElement is ConstructorElement) { |
154 expect(annotationElement.enclosingElement, name2.staticElement); | 155 expect(annotationElement.enclosingElement, name2.staticElement); |
155 expect(annotationElement.displayName, ''); | 156 expect(annotationElement.displayName, ''); |
156 expect(annotationElement.parameters, isEmpty); | 157 expect(annotationElement.parameters, isEmpty); |
157 } else { | 158 } else { |
158 fail('Expected "annotationElement" is ConstructorElement, ' | 159 fail('Expected "annotationElement" is ConstructorElement, ' |
159 'but (${annotationElement?.runtimeType}) $annotationElement found.')
; | 160 'but (${annotationElement?.runtimeType}) $annotationElement found.')
; |
160 } | 161 } |
161 }); | 162 }); |
162 } | 163 } |
163 | 164 |
164 void test_annotation_class_staticConstField() { | 165 void test_annotation_class_staticConstField() { |
165 addNamedSource( | 166 addNamedSource( |
166 '/a.dart', | 167 '/a.dart', |
167 r''' | 168 r''' |
168 class A { | 169 class A { |
169 static const V = 0; | 170 static const V = 0; |
170 } | 171 } |
171 '''); | 172 '''); |
172 _validateAnnotation('', '@A.V', (SimpleIdentifier name1, | 173 _validateAnnotation('', '@A.V', (SimpleIdentifier name1, |
173 SimpleIdentifier name2, | 174 SimpleIdentifier name2, |
174 SimpleIdentifier name3, | 175 SimpleIdentifier name3, |
175 Element annotationElement) { | 176 Element annotationElement) { |
176 expect(name1, isNotNull); | 177 expect(name1, isNotNull); |
177 expect(name1.staticElement, new isInstanceOf<ClassElement>()); | 178 expect(name1.staticElement, new isInstanceOf<ClassElement>()); |
178 expect(name1.staticElement.displayName, 'A'); | 179 expect(staticElementForIdentifier(name1).displayName, 'A'); |
179 expect(name2, isNotNull); | 180 expect(name2, isNotNull); |
180 expect(name2.staticElement, new isInstanceOf<PropertyAccessorElement>()); | 181 expect(name2.staticElement, new isInstanceOf<PropertyAccessorElement>()); |
181 expect(name2.staticElement.displayName, 'V'); | 182 expect(staticElementForIdentifier(name2).displayName, 'V'); |
182 expect(name3, isNull); | 183 expect(name3, isNull); |
183 if (annotationElement is PropertyAccessorElement) { | 184 if (annotationElement is PropertyAccessorElement) { |
184 expect(annotationElement, same(name2.staticElement)); | 185 expect(annotationElement, same(name2.staticElement)); |
185 expect(annotationElement.enclosingElement, name1.staticElement); | 186 expect(annotationElement.enclosingElement, name1.staticElement); |
186 expect(annotationElement.displayName, 'V'); | 187 expect(annotationElement.displayName, 'V'); |
187 } else { | 188 } else { |
188 fail('Expected "annotationElement" is PropertyAccessorElement, ' | 189 fail('Expected "annotationElement" is PropertyAccessorElement, ' |
189 'but (${annotationElement?.runtimeType}) $annotationElement found.')
; | 190 'but (${annotationElement?.runtimeType}) $annotationElement found.')
; |
190 } | 191 } |
191 }); | 192 }); |
192 } | 193 } |
193 | 194 |
194 void test_annotation_class_unnamedConstructor() { | 195 void test_annotation_class_unnamedConstructor() { |
195 addNamedSource( | 196 addNamedSource( |
196 '/a.dart', | 197 '/a.dart', |
197 r''' | 198 r''' |
198 class A { | 199 class A { |
199 const A(); | 200 const A(); |
200 } | 201 } |
201 '''); | 202 '''); |
202 _validateAnnotation('', '@A', (SimpleIdentifier name1, | 203 _validateAnnotation('', '@A', (SimpleIdentifier name1, |
203 SimpleIdentifier name2, | 204 SimpleIdentifier name2, |
204 SimpleIdentifier name3, | 205 SimpleIdentifier name3, |
205 Element annotationElement) { | 206 Element annotationElement) { |
206 expect(name1, isNotNull); | 207 expect(name1, isNotNull); |
207 expect(name1.staticElement, new isInstanceOf<ClassElement>()); | 208 expect(name1.staticElement, new isInstanceOf<ClassElement>()); |
208 expect(name1.staticElement.displayName, 'A'); | 209 expect(staticElementForIdentifier(name1).displayName, 'A'); |
209 expect(name2, isNull); | 210 expect(name2, isNull); |
210 expect(name3, isNull); | 211 expect(name3, isNull); |
211 if (annotationElement is ConstructorElement) { | 212 if (annotationElement is ConstructorElement) { |
212 expect(annotationElement.enclosingElement, name1.staticElement); | 213 expect(annotationElement.enclosingElement, name1.staticElement); |
213 expect(annotationElement.displayName, ''); | 214 expect(annotationElement.displayName, ''); |
214 expect(annotationElement.parameters, isEmpty); | 215 expect(annotationElement.parameters, isEmpty); |
215 } else { | 216 } else { |
216 fail('Expected "annotationElement" is ConstructorElement, ' | 217 fail('Expected "annotationElement" is ConstructorElement, ' |
217 'but (${annotationElement?.runtimeType}) $annotationElement found.')
; | 218 'but (${annotationElement?.runtimeType}) $annotationElement found.')
; |
218 } | 219 } |
219 }); | 220 }); |
220 } | 221 } |
221 | 222 |
222 void test_annotation_topLevelVariable() { | 223 void test_annotation_topLevelVariable() { |
223 addNamedSource( | 224 addNamedSource( |
224 '/a.dart', | 225 '/a.dart', |
225 r''' | 226 r''' |
226 const V = 0; | 227 const V = 0; |
227 '''); | 228 '''); |
228 _validateAnnotation('', '@V', (SimpleIdentifier name1, | 229 _validateAnnotation('', '@V', (SimpleIdentifier name1, |
229 SimpleIdentifier name2, | 230 SimpleIdentifier name2, |
230 SimpleIdentifier name3, | 231 SimpleIdentifier name3, |
231 Element annotationElement) { | 232 Element annotationElement) { |
232 expect(name1, isNotNull); | 233 expect(name1, isNotNull); |
233 expect(name1.staticElement, new isInstanceOf<PropertyAccessorElement>()); | 234 expect(name1.staticElement, new isInstanceOf<PropertyAccessorElement>()); |
234 expect(name1.staticElement.displayName, 'V'); | 235 expect(staticElementForIdentifier(name1).displayName, 'V'); |
235 expect(name2, isNull); | 236 expect(name2, isNull); |
236 expect(name3, isNull); | 237 expect(name3, isNull); |
237 if (annotationElement is PropertyAccessorElement) { | 238 if (annotationElement is PropertyAccessorElement) { |
238 expect(annotationElement, same(name1.staticElement)); | 239 expect(annotationElement, same(name1.staticElement)); |
239 expect(annotationElement.enclosingElement, | 240 expect(annotationElement.enclosingElement, |
240 new isInstanceOf<CompilationUnitElement>()); | 241 new isInstanceOf<CompilationUnitElement>()); |
241 expect(annotationElement.displayName, 'V'); | 242 expect(annotationElement.displayName, 'V'); |
242 } else { | 243 } else { |
243 fail('Expected "annotationElement" is PropertyAccessorElement, ' | 244 fail('Expected "annotationElement" is PropertyAccessorElement, ' |
244 'but (${annotationElement?.runtimeType}) $annotationElement found.')
; | 245 'but (${annotationElement?.runtimeType}) $annotationElement found.')
; |
245 } | 246 } |
246 }); | 247 }); |
247 } | 248 } |
248 | 249 |
249 void test_annotation_topLevelVariable_prefixed() { | 250 void test_annotation_topLevelVariable_prefixed() { |
250 addNamedSource( | 251 addNamedSource( |
251 '/a.dart', | 252 '/a.dart', |
252 r''' | 253 r''' |
253 const V = 0; | 254 const V = 0; |
254 '''); | 255 '''); |
255 _validateAnnotation('as p', '@p.V', (SimpleIdentifier name1, | 256 _validateAnnotation('as p', '@p.V', (SimpleIdentifier name1, |
256 SimpleIdentifier name2, | 257 SimpleIdentifier name2, |
257 SimpleIdentifier name3, | 258 SimpleIdentifier name3, |
258 Element annotationElement) { | 259 Element annotationElement) { |
259 expect(name1, isNotNull); | 260 expect(name1, isNotNull); |
260 expect(name1.staticElement, new isInstanceOf<PrefixElement>()); | 261 expect(name1.staticElement, new isInstanceOf<PrefixElement>()); |
261 expect(name1.staticElement.displayName, 'p'); | 262 expect(staticElementForIdentifier(name1).displayName, 'p'); |
262 expect(name2, isNotNull); | 263 expect(name2, isNotNull); |
263 expect(name2.staticElement, new isInstanceOf<PropertyAccessorElement>()); | 264 expect(name2.staticElement, new isInstanceOf<PropertyAccessorElement>()); |
264 expect(name2.staticElement.displayName, 'V'); | 265 expect(staticElementForIdentifier(name2).displayName, 'V'); |
265 expect(name3, isNull); | 266 expect(name3, isNull); |
266 if (annotationElement is PropertyAccessorElement) { | 267 if (annotationElement is PropertyAccessorElement) { |
267 expect(annotationElement, same(name2.staticElement)); | 268 expect(annotationElement, same(name2.staticElement)); |
268 expect(annotationElement.enclosingElement, | 269 expect(annotationElement.enclosingElement, |
269 new isInstanceOf<CompilationUnitElement>()); | 270 new isInstanceOf<CompilationUnitElement>()); |
270 expect(annotationElement.displayName, 'V'); | 271 expect(annotationElement.displayName, 'V'); |
271 } else { | 272 } else { |
272 fail('Expected "annotationElement" is PropertyAccessorElement, ' | 273 fail('Expected "annotationElement" is PropertyAccessorElement, ' |
273 'but (${annotationElement?.runtimeType}) $annotationElement found.')
; | 274 'but (${annotationElement?.runtimeType}) $annotationElement found.')
; |
274 } | 275 } |
(...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
683 ClassElementImpl classA = ElementFactory.classElement2("A"); | 684 ClassElementImpl classA = ElementFactory.classElement2("A"); |
684 classA.fields = <FieldElement>[fieldElement]; | 685 classA.fields = <FieldElement>[fieldElement]; |
685 FieldFormalParameter parameter = | 686 FieldFormalParameter parameter = |
686 AstTestFactory.fieldFormalParameter2(fieldName); | 687 AstTestFactory.fieldFormalParameter2(fieldName); |
687 FieldFormalParameterElementImpl parameterElement = | 688 FieldFormalParameterElementImpl parameterElement = |
688 ElementFactory.fieldFormalParameter(parameter.identifier); | 689 ElementFactory.fieldFormalParameter(parameter.identifier); |
689 parameterElement.field = fieldElement; | 690 parameterElement.field = fieldElement; |
690 parameterElement.type = intType; | 691 parameterElement.type = intType; |
691 parameter.identifier.staticElement = parameterElement; | 692 parameter.identifier.staticElement = parameterElement; |
692 _resolveInClass(parameter, classA); | 693 _resolveInClass(parameter, classA); |
693 expect(parameter.element.type, same(intType)); | 694 expect(elementForFormalParameter(parameter).type, same(intType)); |
694 } | 695 } |
695 | 696 |
696 void test_visitImportDirective_noCombinators_noPrefix() { | 697 void test_visitImportDirective_noCombinators_noPrefix() { |
697 ImportDirective directive = AstTestFactory.importDirective3(null, null); | 698 ImportDirective directive = AstTestFactory.importDirective3(null, null); |
698 directive.element = ElementFactory.importFor( | 699 directive.element = ElementFactory.importFor( |
699 ElementFactory.library(_definingLibrary.context, "lib"), null); | 700 ElementFactory.library(_definingLibrary.context, "lib"), null); |
700 _resolveNode(directive); | 701 _resolveNode(directive); |
701 _listener.assertNoErrors(); | 702 _listener.assertNoErrors(); |
702 } | 703 } |
703 | 704 |
(...skipping 586 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1290 innerScope = new LabelScope( | 1291 innerScope = new LabelScope( |
1291 outerScope, labelElement.name, labelTarget, labelElement); | 1292 outerScope, labelElement.name, labelTarget, labelElement); |
1292 } | 1293 } |
1293 _visitor.labelScope = innerScope; | 1294 _visitor.labelScope = innerScope; |
1294 statement.accept(_resolver); | 1295 statement.accept(_resolver); |
1295 } finally { | 1296 } finally { |
1296 _visitor.labelScope = outerScope; | 1297 _visitor.labelScope = outerScope; |
1297 } | 1298 } |
1298 } | 1299 } |
1299 } | 1300 } |
OLD | NEW |