Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(563)

Side by Side Diff: lib/merge.ts

Issue 2434903002: Fix crash generating facades for loasd. Fix bug in how we handle TypePredicates. Add test for TypeP… (Closed)
Patch Set: Fix crash generating facades for loasd. Fix bug in how we handle TypePredicates. Add test for TypeP… Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « lib/facade_converter.ts ('k') | package.json » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 import ts = require('typescript'); 1 import ts = require('typescript');
2 import base = require('./base'); 2 import base = require('./base');
3 import {FacadeConverter} from './facade_converter'; 3 import {FacadeConverter} from './facade_converter';
4 4
5 /** 5 /**
6 * To support arbitrary d.ts files in Dart we often have to merge two TypeScript 6 * To support arbitrary d.ts files in Dart we often have to merge two TypeScript
7 * types into a single Dart type because Dart lacks features such as method 7 * types into a single Dart type because Dart lacks features such as method
8 * overloads, type aliases, and union types. 8 * overloads, type aliases, and union types.
9 */ 9 */
10 export class MergedType { 10 export class MergedType {
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
129 return ret; 129 return ret;
130 } 130 }
131 131
132 setOptional() { 132 setOptional() {
133 this.optional = true; 133 this.optional = true;
134 } 134 }
135 135
136 private name: Set<string> = new Set(); 136 private name: Set<string> = new Set();
137 private type: MergedType; 137 private type: MergedType;
138 private optional: boolean = false; 138 private optional: boolean = false;
139 private textRange: ts.TextRange; 139 private textRange: ts.Node;
140 } 140 }
141 141
142 /** 142 /**
143 * Handle a parameter that is the result of merging parameter declarations from 143 * Handle a parameter that is the result of merging parameter declarations from
144 * multiple method overloads. 144 * multiple method overloads.
145 */ 145 */
146 export class MergedTypeParameter { 146 export class MergedTypeParameter {
147 constructor(param: ts.TypeParameterDeclaration, fc: FacadeConverter) { 147 constructor(param: ts.TypeParameterDeclaration, fc: FacadeConverter) {
148 this.constraint = new MergedType(fc); 148 this.constraint = new MergedType(fc);
149 this.textRange = param; 149 this.textRange = param;
(...skipping 17 matching lines...) Expand all
167 // We can't currently handle union types in merged type parameters as the co mments for type 167 // We can't currently handle union types in merged type parameters as the co mments for type
168 // parameters in function types are not there for documentation and impact s trong mode. 168 // parameters in function types are not there for documentation and impact s trong mode.
169 if (constraint && constraint.kind !== ts.SyntaxKind.UnionType) { 169 if (constraint && constraint.kind !== ts.SyntaxKind.UnionType) {
170 ret.constraint = constraint; 170 ret.constraint = constraint;
171 } 171 }
172 return ret; 172 return ret;
173 } 173 }
174 174
175 private name: string; 175 private name: string;
176 private constraint: MergedType; 176 private constraint: MergedType;
177 private textRange: ts.TextRange; 177 private textRange: ts.Node;
178 } 178 }
179 179
180 /** 180 /**
181 * Handle a parameter that is the result of merging parameter declarations from 181 * Handle a parameter that is the result of merging parameter declarations from
182 * multiple method overloads. 182 * multiple method overloads.
183 */ 183 */
184 export class MergedTypeParameters { 184 export class MergedTypeParameters {
185 private mergedParameters: Map<string, MergedTypeParameter> = new Map(); 185 private mergedParameters: Map<string, MergedTypeParameter> = new Map();
186 private textRange: ts.TextRange; 186 private textRange: ts.TextRange;
187 187
(...skipping 17 matching lines...) Expand all
205 } 205 }
206 } 206 }
207 } 207 }
208 208
209 toTypeParameters(): ts.NodeArray<ts.TypeParameterDeclaration> { 209 toTypeParameters(): ts.NodeArray<ts.TypeParameterDeclaration> {
210 if (this.mergedParameters.size === 0) { 210 if (this.mergedParameters.size === 0) {
211 return undefined; 211 return undefined;
212 } 212 }
213 213
214 let ret = [] as ts.NodeArray<ts.TypeParameterDeclaration>; 214 let ret = [] as ts.NodeArray<ts.TypeParameterDeclaration>;
215 base.copyLocation(this.textRange, ret); 215 base.copyNodeArrayLocation(this.textRange, ret);
216
216 this.mergedParameters.forEach((mergedParameter) => { 217 this.mergedParameters.forEach((mergedParameter) => {
217 ret.push(mergedParameter.toTypeParameterDeclaration()); 218 ret.push(mergedParameter.toTypeParameterDeclaration());
218 }); 219 });
219 220
220 return ret; 221 return ret;
221 } 222 }
222 } 223 }
223 224
224 /** 225 /**
225 * Normalize a SourceFile 226 * Normalize a SourceFile
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
322 } 323 }
323 324
324 if (existingClass || hasConstructor) { 325 if (existingClass || hasConstructor) {
325 if (!existingClass) { 326 if (!existingClass) {
326 // Create a stub existing class to upgrade the object literal to if there is not an 327 // Create a stub existing class to upgrade the object literal to if there is not an
327 // existing class with the same name. 328 // existing class with the same name.
328 let clazz = <ts.ClassDeclaration>ts.createNode(ts.SyntaxKind.Cla ssDeclaration); 329 let clazz = <ts.ClassDeclaration>ts.createNode(ts.SyntaxKind.Cla ssDeclaration);
329 base.copyLocation(declaration, clazz); 330 base.copyLocation(declaration, clazz);
330 clazz.name = declaration.name as ts.Identifier; 331 clazz.name = declaration.name as ts.Identifier;
331 clazz.members = <ts.NodeArray<ts.ClassElement>>[]; 332 clazz.members = <ts.NodeArray<ts.ClassElement>>[];
332 base.copyLocation(declaration, clazz.members); 333 base.copyNodeArrayLocation(declaration, clazz.members);
333 replaceNode(n, clazz); 334 replaceNode(n, clazz);
334 classes.set(name, clazz); 335 classes.set(name, clazz);
335 } 336 }
336 337
337 let existing = classes.get(name); 338 let existing = classes.get(name);
338 if (existing.kind === ts.SyntaxKind.InterfaceDeclaration) { 339 if (existing.kind === ts.SyntaxKind.InterfaceDeclaration) {
339 let interfaceDecl = existing as base.ExtendedInterfaceDeclaratio n; 340 let interfaceDecl = existing as base.ExtendedInterfaceDeclaratio n;
340 // It is completely safe to assume that we know the precise clas s like variable 341 // It is completely safe to assume that we know the precise clas s like variable
341 // declaration for the interface in this case as they have the s ame exact name. 342 // declaration for the interface in this case as they have the s ame exact name.
342 interfaceDecl.classLikeVariableDeclaration = declaration; 343 interfaceDecl.classLikeVariableDeclaration = declaration;
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
483 break; 484 break;
484 case ts.SyntaxKind.ModuleBlock: 485 case ts.SyntaxKind.ModuleBlock:
485 ts.forEachChild(n, (child) => gatherClasses(child, classes)); 486 ts.forEachChild(n, (child) => gatherClasses(child, classes));
486 break; 487 break;
487 default: 488 default:
488 break; 489 break;
489 } 490 }
490 } 491 }
491 gatherClasses(f, new Map()); 492 gatherClasses(f, new Map());
492 } 493 }
OLDNEW
« no previous file with comments | « lib/facade_converter.ts ('k') | package.json » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698