69 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import {StringWrapper, RegExpWrapper, isJsObject} from 'angular2/src/core/facade/lang';
 | |
| 
 | |
| var IS_FIELD = RegExpWrapper.create('^\\w+[\\.|\\#]\\w+=?$');
 | |
| var IS_INTERFACE = RegExpWrapper.create('^\\{.+\\}');
 | |
| var IS_DART = RegExpWrapper.create('\\:dart$');
 | |
| var IS_JS = RegExpWrapper.create('\\:js$');
 | |
| var IS_OPTIONAL = RegExpWrapper.create('\\:optional$');
 | |
| var JS = 'JS';
 | |
| var DART = 'Dart';
 | |
| var MODE = isJsObject({}) ? JS : DART;
 | |
| 
 | |
| export class SymbolsDiff {
 | |
|   missing: string[] = [];
 | |
|   extra: string[] = [];
 | |
|   errors: string[] = [];
 | |
| 
 | |
|   constructor(public actual: string[], public expected: string[]) {
 | |
|     this.actual.sort(compareIgnoreLang);
 | |
|     this.expected.sort(compareIgnoreLang);
 | |
|     this.computeDiff();
 | |
|   }
 | |
| 
 | |
|   computeDiff(): void {
 | |
|     for (var i = 0, j = 0, length = this.expected.length + this.actual.length; i + j < length;) {
 | |
|       var expectedName: string = i < this.expected.length ? this.expected[i] : '~';
 | |
|       var actualName: string = j < this.actual.length ? this.actual[j] : '~';
 | |
|       if (stripLang(expectedName) == stripLang(actualName)) {
 | |
|         i++;
 | |
|         j++;
 | |
|       } else if (StringWrapper.compare(stripLang(expectedName), stripLang(actualName)) > 0) {
 | |
|         // JS does not see fields so ignore none method symbols
 | |
|         if (!this.shouldIgnore(expectedName)) {
 | |
|           this.extra.push(actualName);
 | |
|           this.errors.push('+ ' + actualName);
 | |
|         }
 | |
|         j++;
 | |
|       } else {
 | |
|         if (!this.shouldIgnore(expectedName)) {
 | |
|           this.missing.push(expectedName);
 | |
|           this.errors.push('- ' + expectedName);
 | |
|         }
 | |
|         i++;
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   shouldIgnore(expected: string): boolean {
 | |
|     var ignore = false;
 | |
|     if (MODE == JS) {
 | |
|       ignore = RegExpWrapper.test(IS_FIELD, expected) ||
 | |
|                RegExpWrapper.test(IS_INTERFACE, expected) ||
 | |
|                RegExpWrapper.test(IS_DART, expected) || RegExpWrapper.test(IS_OPTIONAL, expected)
 | |
|     } else {
 | |
|       ignore = RegExpWrapper.test(IS_JS, expected) || RegExpWrapper.test(IS_OPTIONAL, expected)
 | |
|     }
 | |
|     return ignore;
 | |
|   }
 | |
| }
 | |
| 
 | |
| function stripLang(text: string): string {
 | |
|   var index = text.indexOf(':');
 | |
|   if (index >= 0) text = text.substring(0, index);
 | |
|   return text;
 | |
| }
 | |
| 
 | |
| function compareIgnoreLang(a: string, b: string): number {
 | |
|   return StringWrapper.compare(stripLang(a), stripLang(b));
 | |
| }
 |