From ea3e509154efd42fc30c5198c34aefe229aa02e2 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Fri, 12 Dec 2014 15:29:52 -0800 Subject: [PATCH 1/6] Make utility mehtod names clearer. --- src/compiler/types.ts | 10 ++++------ src/compiler/utilities.ts | 17 ++++++++++------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 2c5376e744..48288628a1 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -325,14 +325,12 @@ module ts { // Context flags computed by aggregating child flags upwards. - // If this node, or any of it's children (transitively) contain an error. + // Used during incremental parsing to determine if this node or any of its children had an + // error. Computed only once and then cached. ThisNodeOrAnySubNodesHasError = 1 << 5, - // Used during incremental parsing to determine if we need to visit this node to see if - // any of its children had an error. Once we compute that once, we can set this bit on the - // node to know that we never have to do it again. From that point on, we can just check - // the node directly for 'ContainsError'. - HasComputedThisNodeOrAnySubNodesHasError = 1 << 6 + // Used to know if we've computed data from children and cached it in this node. + HasAggregatedChildData = 1 << 6 } export interface Node extends TextRange { diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index d35364009b..8e0a02b2be 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -62,31 +62,34 @@ module ts { return node.end - node.pos; } - export function hasFlag(val: number, flag: number): boolean { + function hasFlag(val: number, flag: number): boolean { return (val & flag) !== 0; } // Returns true if this node contains a parse error anywhere underneath it. export function containsParseError(node: Node): boolean { - if (!hasFlag(node.parserContextFlags, ParserContextFlags.HasComputedThisNodeOrAnySubNodesHasError)) { + aggregateChildData(node); + return hasFlag(node.parserContextFlags, ParserContextFlags.ThisNodeOrAnySubNodesHasError); + } + + function aggregateChildData(node: Node): void { + if (!hasFlag(node.parserContextFlags, ParserContextFlags.HasAggregatedChildData)) { // A node is considered to contain a parse error if: // a) the parser explicitly marked that it had an error // b) any of it's children reported that it had an error. - var val = hasFlag(node.parserContextFlags, ParserContextFlags.ThisNodeHasError) || + var thisNodeOrAnySubNodesHasError = hasFlag(node.parserContextFlags, ParserContextFlags.ThisNodeHasError) || forEachChild(node, containsParseError); // If so, mark ourselves accordingly. - if (val) { + if (thisNodeOrAnySubNodesHasError) { node.parserContextFlags |= ParserContextFlags.ThisNodeOrAnySubNodesHasError; } // Also mark that we've propogated the child information to this node. This way we can // always consult the bit directly on this node without needing to check its children // again. - node.parserContextFlags |= ParserContextFlags.HasComputedThisNodeOrAnySubNodesHasError; + node.parserContextFlags |= ParserContextFlags.HasAggregatedChildData; } - - return hasFlag(node.parserContextFlags, ParserContextFlags.ThisNodeOrAnySubNodesHasError); } export function getSourceFileOfNode(node: Node): SourceFile { From f5d622f0c912c2b8857dec246cf3487ed9f19ba8 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Sun, 14 Dec 2014 10:57:34 -0800 Subject: [PATCH 2/6] Move test helpers into the harness Utils module. --- src/harness/harness.ts | 54 +++++++++++++++++++++ tests/cases/unittests/incrementalParser.ts | 56 +--------------------- 2 files changed, 55 insertions(+), 55 deletions(-) diff --git a/src/harness/harness.ts b/src/harness/harness.ts index 64d8b87350..edc0aa4902 100644 --- a/src/harness/harness.ts +++ b/src/harness/harness.ts @@ -290,6 +290,60 @@ module Utils { return o; } } + + export function assertStructuralEquals(node1: ts.Node, node2: ts.Node) { + if (node1 === node2) { + return; + } + + assert(node1, "node1"); + assert(node2, "node2"); + assert.equal(node1.pos, node2.pos, "node1.pos !== node2.pos"); + assert.equal(node1.end, node2.end, "node1.end !== node2.end"); + assert.equal(node1.kind, node2.kind, "node1.kind !== node2.kind"); + assert.equal(node1.flags, node2.flags, "node1.flags !== node2.flags"); + assert.equal(node1.parserContextFlags, node2.parserContextFlags, "node1.parserContextFlags !== node2.parserContextFlags"); + + ts.forEachChild(node1, + child1 => { + var childName = findChildName(node1, child1); + var child2: ts.Node = (node2)[childName]; + + assertStructuralEquals(child1, child2); + }, + (array1: ts.NodeArray) => { + var childName = findChildName(node1, array1); + var array2: ts.NodeArray = (node2)[childName]; + + assertArrayStructuralEquals(array1, array2); + }); + } + + function assertArrayStructuralEquals(array1: ts.NodeArray, array2: ts.NodeArray) { + if (array1 === array2) { + return; + } + + assert(array1, "array1"); + assert(array2, "array2"); + assert.equal(array1.pos, array2.pos, "array1.pos !== array2.pos"); + assert.equal(array1.end, array2.end, "array1.end !== array2.end"); + assert.equal(array1.length, array2.length, "array1.length !== array2.length"); + + for (var i = 0, n = array1.length; i < n; i++) { + assertStructuralEquals(array1[i], array2[i]); + } + } + + function findChildName(parent: any, child: any) { + for (var name in parent) { + if (parent.hasOwnProperty(name) && parent[name] === child) { + return name; + } + } + + throw new Error("Could not find child in parent"); + } } module Harness.Path { diff --git a/tests/cases/unittests/incrementalParser.ts b/tests/cases/unittests/incrementalParser.ts index 74b67810d2..e89f35aa93 100644 --- a/tests/cases/unittests/incrementalParser.ts +++ b/tests/cases/unittests/incrementalParser.ts @@ -39,7 +39,7 @@ module ts { Utils.assertInvariants(incrementalNewTree, /*parent:*/ undefined); // We should get the same tree when doign a full or incremental parse. - assertStructuralEquals(newTree, incrementalNewTree); + Utils.assertStructuralEquals(newTree, incrementalNewTree); // There should be no reused nodes between two trees that are fully parsed. assert.isTrue(reusedElements(oldTree, newTree) === 0); @@ -52,60 +52,6 @@ module ts { return incrementalNewTree; } - function assertStructuralEquals(node1: Node, node2: Node) { - if (node1 === node2) { - return; - } - - assert(node1, "node1"); - assert(node2, "node2"); - assert.equal(node1.pos, node2.pos, "node1.pos !== node2.pos"); - assert.equal(node1.end, node2.end, "node1.end !== node2.end"); - assert.equal(node1.kind, node2.kind, "node1.kind !== node2.kind"); - assert.equal(node1.flags, node2.flags, "node1.flags !== node2.flags"); - assert.equal(node1.parserContextFlags, node2.parserContextFlags, "node1.parserContextFlags !== node2.parserContextFlags"); - - forEachChild(node1, - child1 => { - var childName = findChildName(node1, child1); - var child2: Node = (node2)[childName]; - - assertStructuralEquals(child1, child2); - }, - (array1: NodeArray) => { - var childName = findChildName(node1, array1); - var array2: NodeArray = (node2)[childName]; - - assertArrayStructuralEquals(array1, array2); - }); - } - - function assertArrayStructuralEquals(array1: NodeArray, array2: NodeArray) { - if (array1 === array2) { - return; - } - - assert(array1, "array1"); - assert(array2, "array2"); - assert.equal(array1.pos, array2.pos, "array1.pos !== array2.pos"); - assert.equal(array1.end, array2.end, "array1.end !== array2.end"); - assert.equal(array1.length, array2.length, "array1.length !== array2.length"); - - for (var i = 0, n = array1.length; i < n; i++) { - assertStructuralEquals(array1[i], array2[i]); - } - } - - function findChildName(parent: any, child: any) { - for (var name in parent) { - if (parent.hasOwnProperty(name) && parent[name] === child) { - return name; - } - } - - throw new Error("Could not find child in parent"); - } - function reusedElements(oldNode: SourceFile, newNode: SourceFile): number { var allOldElements = collectElements(oldNode); var allNewElements = collectElements(newNode); From bd4aed25da30995abcc5969ad7d14d9c6dd869a5 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Sun, 14 Dec 2014 11:16:50 -0800 Subject: [PATCH 3/6] Don't convert the tree to JSON before checking it. Just check it directly. --- src/harness/fourslash.ts | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/harness/fourslash.ts b/src/harness/fourslash.ts index 18d34e94b0..69bc296262 100644 --- a/src/harness/fourslash.ts +++ b/src/harness/fourslash.ts @@ -1434,12 +1434,7 @@ module FourSlash { this.raiseError('Mismatched incremental/reference syntactic diagnostics for file ' + this.activeFile.fileName + '.\n=== Incremental diagnostics ===\n' + incrementalSyntaxDiagnostics + '\n=== Reference Diagnostics ===\n' + referenceSyntaxDiagnostics); } - var incrementalSourceFileJSON = Utils.sourceFileToJSON(incrementalSourceFile); - var referenceSourceFileJSON = Utils.sourceFileToJSON(referenceSourceFile); - - if (incrementalSyntaxDiagnostics !== referenceSyntaxDiagnostics) { - this.raiseError('Mismatched incremental/reference ast for file ' + this.activeFile.fileName + '.\n=== Incremental AST ===\n' + incrementalSourceFileJSON + '\n=== Reference AST ===\n' + referenceSourceFileJSON); - } + Utils.assertStructuralEquals(incrementalSourceFile, referenceSourceFile); //if (this.editValidation !== IncrementalEditValidation.SyntacticOnly) { // var compiler = new TypeScript.TypeScriptCompiler(); From 6d9bfda3e522dec09bc5d657b2679c30817e6080 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Sun, 14 Dec 2014 11:20:50 -0800 Subject: [PATCH 4/6] Check post edit invariants after every edit. --- src/harness/fourslash.ts | 31 +++++++++++++------------------ 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/src/harness/fourslash.ts b/src/harness/fourslash.ts index 69bc296262..5b55f73137 100644 --- a/src/harness/fourslash.ts +++ b/src/harness/fourslash.ts @@ -1233,11 +1233,6 @@ module FourSlash { ts.forEach(fileNames, Harness.IO.log); } - private editCheckpoint(filename: string) { - // TODO: What's this for? It is being called by deleteChar - // this.languageService.getScriptLexicalStructure(filename); - } - public deleteChar(count = 1) { this.scenarioActions.push(''); @@ -1248,7 +1243,7 @@ module FourSlash { // Make the edit this.languageServiceShimHost.editScript(this.activeFile.fileName, offset, offset + 1, ch); this.updateMarkersForEdit(this.activeFile.fileName, offset, offset + 1, ch); - this.editCheckpoint(this.activeFile.fileName); + this.checkPostEditInvariants(); // Handle post-keystroke formatting if (this.enableFormatting) { @@ -1269,7 +1264,7 @@ module FourSlash { this.languageServiceShimHost.editScript(this.activeFile.fileName, start, start + length, text); this.updateMarkersForEdit(this.activeFile.fileName, start, start + length, text); - this.editCheckpoint(this.activeFile.fileName); + this.checkPostEditInvariants(); this.checkPostEditInvariants(); } @@ -1285,13 +1280,13 @@ module FourSlash { // Make the edit this.languageServiceShimHost.editScript(this.activeFile.fileName, offset, offset + 1, ch); this.updateMarkersForEdit(this.activeFile.fileName, offset, offset + 1, ch); - this.editCheckpoint(this.activeFile.fileName); + this.checkPostEditInvariants(); // Handle post-keystroke formatting if (this.enableFormatting) { var edits = this.languageService.getFormattingEditsAfterKeystroke(this.activeFile.fileName, offset, ch, this.formatCodeOptions); offset += this.applyEdits(this.activeFile.fileName, edits, true); - this.editCheckpoint(this.activeFile.fileName); + this.checkPostEditInvariants(); } } @@ -1299,7 +1294,6 @@ module FourSlash { this.currentCaretPosition = offset; this.fixCaretPosition(); - this.checkPostEditInvariants(); } @@ -1325,14 +1319,16 @@ module FourSlash { var ch = text.charAt(i); this.languageServiceShimHost.editScript(this.activeFile.fileName, offset, offset, ch); this.updateMarkersForEdit(this.activeFile.fileName, offset, offset, ch); - this.editCheckpoint(this.activeFile.fileName); + this.checkPostEditInvariants(); offset++; // Handle post-keystroke formatting if (this.enableFormatting) { var edits = this.languageService.getFormattingEditsAfterKeystroke(this.activeFile.fileName, offset, ch, this.formatCodeOptions); - offset += this.applyEdits(this.activeFile.fileName, edits, true); - this.editCheckpoint(this.activeFile.fileName); + if (edits.length) { + offset += this.applyEdits(this.activeFile.fileName, edits, true); + this.checkPostEditInvariants(); + } } } @@ -1340,7 +1336,6 @@ module FourSlash { this.currentCaretPosition = offset; this.fixCaretPosition(); - this.checkPostEditInvariants(); } @@ -1357,7 +1352,7 @@ module FourSlash { this.languageService.getBraceMatchingAtPosition(this.activeFile.fileName, offset); this.updateMarkersForEdit(this.activeFile.fileName, offset, offset, ch); - this.editCheckpoint(this.activeFile.fileName); + this.checkPostEditInvariants(); offset++; if (ch === '(' || ch === ',') { @@ -1377,7 +1372,7 @@ module FourSlash { if (this.enableFormatting) { var edits = this.languageService.getFormattingEditsAfterKeystroke(this.activeFile.fileName, offset, ch, this.formatCodeOptions); offset += this.applyEdits(this.activeFile.fileName, edits, true); - this.editCheckpoint(this.activeFile.fileName); + this.checkPostEditInvariants(); } } @@ -1397,14 +1392,14 @@ module FourSlash { var offset = this.currentCaretPosition; this.languageServiceShimHost.editScript(this.activeFile.fileName, offset, offset, text); this.updateMarkersForEdit(this.activeFile.fileName, offset, offset, text); - this.editCheckpoint(this.activeFile.fileName); + this.checkPostEditInvariants(); offset += text.length; // Handle formatting if (this.enableFormatting) { var edits = this.languageService.getFormattingEditsForRange(this.activeFile.fileName, start, offset, this.formatCodeOptions); offset += this.applyEdits(this.activeFile.fileName, edits, true); - this.editCheckpoint(this.activeFile.fileName); + this.checkPostEditInvariants(); } // Move the caret to wherever we ended up From 0e01e48d0e1af1d46898c66cd1f59a5998ab3f7d Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Sun, 14 Dec 2014 11:34:15 -0800 Subject: [PATCH 5/6] Always run all fourslash tests in high fidelity typing mode. We want to verify after every edit that our incremental data is correct. --- src/harness/fourslash.ts | 54 +------------------ tests/cases/fourslash/addMemberToInterface.ts | 1 - tests/cases/fourslash/addMemberToModule.ts | 28 +++++----- ...cellationWhenfindingAllRefsOnDefinition.ts | 3 -- tests/cases/fourslash/cloduleAsBaseClass.ts | 2 - tests/cases/fourslash/cloduleAsBaseClass2.ts | 1 - ...foreSemanticDiagnosticsInArrowFunction1.ts | 3 -- .../fourslash/completionEntryForPrimitive.ts | 1 - ...ariableDeclOfMergedVariableAndClassDecl.ts | 2 - .../fourslash/findAllRefsOnDefinition.ts | 2 - .../fourslash/findAllRefsOnDefinition2.ts | 2 - tests/cases/fourslash/fourslash.ts | 21 -------- .../fourslash/getCompletionEntryDetails.ts | 3 -- ...tionExpressionAboveInterfaceDeclaration.ts | 6 +-- tests/cases/fourslash/incrementalParsing1.ts | 2 - .../fourslash/incrementalResolveAccessor.ts | 6 +-- ...ncrementalResolveConstructorDeclaration.ts | 4 +- ...mentalResolveFunctionPropertyAssignment.ts | 7 +-- .../fourslash/quickInfoOnMergedInterfaces.ts | 4 +- ...oOnMergedInterfacesWithIncrementalEdits.ts | 2 - .../fourslash/quickInfoOnMergedModule.ts | 2 - ...nfoOnUnResolvedBaseConstructorSignature.ts | 1 - ...allOnFunctionDeclarationInMultipleFiles.ts | 11 ++-- ...ureHelpOnSuperWhenMembersAreNotResolved.ts | 1 - .../typeCheckAfterAddingGenericParameter.ts | 2 - .../cases/fourslash/typeCheckAfterResolve.ts | 45 ++++++++-------- 26 files changed, 48 insertions(+), 168 deletions(-) diff --git a/src/harness/fourslash.ts b/src/harness/fourslash.ts index 5b55f73137..0eca198129 100644 --- a/src/harness/fourslash.ts +++ b/src/harness/fourslash.ts @@ -96,19 +96,6 @@ module FourSlash { end: number; } - export enum IncrementalEditValidation { - None, - SyntacticOnly, - Complete - } - - export enum TypingFidelity { - /// Performs typing and formatting (if formatting is enabled) - Low, - /// Performs typing, checks completion lists, signature help, and formatting (if enabled) - High - } - var entityMap: ts.Map = { '&': '&', '"': '"', @@ -279,9 +266,6 @@ module FourSlash { public cancellationToken: TestCancellationToken; - public editValidation = IncrementalEditValidation.Complete; - public typingFidelity = TypingFidelity.Low; - private scenarioActions: string[] = []; private taoInvalidReason: string = null; @@ -1305,38 +1289,7 @@ module FourSlash { this.scenarioActions.push(''); } - if (this.typingFidelity === TypingFidelity.Low) { - return this.typeLowFidelity(text); - } else { - return this.typeHighFidelity(text); - } - } - - private typeLowFidelity(text: string) { - var offset = this.currentCaretPosition; - for (var i = 0; i < text.length; i++) { - // Make the edit - var ch = text.charAt(i); - this.languageServiceShimHost.editScript(this.activeFile.fileName, offset, offset, ch); - this.updateMarkersForEdit(this.activeFile.fileName, offset, offset, ch); - this.checkPostEditInvariants(); - offset++; - - // Handle post-keystroke formatting - if (this.enableFormatting) { - var edits = this.languageService.getFormattingEditsAfterKeystroke(this.activeFile.fileName, offset, ch, this.formatCodeOptions); - if (edits.length) { - offset += this.applyEdits(this.activeFile.fileName, edits, true); - this.checkPostEditInvariants(); - } - } - } - - // Move the caret to wherever we ended up - this.currentCaretPosition = offset; - - this.fixCaretPosition(); - this.checkPostEditInvariants(); + return this.typeHighFidelity(text); } // Enters lines of text at the current caret position, invoking @@ -1380,7 +1333,6 @@ module FourSlash { this.currentCaretPosition = offset; this.fixCaretPosition(); - this.checkPostEditInvariants(); } @@ -1410,10 +1362,6 @@ module FourSlash { } private checkPostEditInvariants() { - if (this.editValidation === IncrementalEditValidation.None) { - return; - } - var incrementalSourceFile = this.languageService.getSourceFile(this.activeFile.fileName); var incrementalSyntaxDiagnostics = JSON.stringify(Utils.convertDiagnostics(incrementalSourceFile.getSyntacticDiagnostics())); diff --git a/tests/cases/fourslash/addMemberToInterface.ts b/tests/cases/fourslash/addMemberToInterface.ts index e961c6a0cb..cc0ecbdb36 100644 --- a/tests/cases/fourslash/addMemberToInterface.ts +++ b/tests/cases/fourslash/addMemberToInterface.ts @@ -9,7 +9,6 @@ //// } edit.disableFormatting(); -diagnostics.setEditValidation(IncrementalEditValidation.SyntacticOnly); goTo.marker('check'); verify.quickInfoIs('module Mod'); diff --git a/tests/cases/fourslash/addMemberToModule.ts b/tests/cases/fourslash/addMemberToModule.ts index 6b0e0d0eef..b67d1827a4 100644 --- a/tests/cases/fourslash/addMemberToModule.ts +++ b/tests/cases/fourslash/addMemberToModule.ts @@ -1,20 +1,18 @@ -/// - +/// + ////module A { //// /*var*/ ////} ////module /*check*/A { //// var p; -////} - -diagnostics.setEditValidation(IncrementalEditValidation.SyntacticOnly); - -goTo.marker('check'); -verify.quickInfoExists(); - -goTo.marker('var'); -edit.insert('var o;'); - -goTo.marker('check'); -verify.quickInfoExists(); - +////} + +goTo.marker('check'); +verify.quickInfoExists(); + +goTo.marker('var'); +edit.insert('var o;'); + +goTo.marker('check'); +verify.quickInfoExists(); + diff --git a/tests/cases/fourslash/cancellationWhenfindingAllRefsOnDefinition.ts b/tests/cases/fourslash/cancellationWhenfindingAllRefsOnDefinition.ts index 0ec7c9bcf2..09f580bb96 100644 --- a/tests/cases/fourslash/cancellationWhenfindingAllRefsOnDefinition.ts +++ b/tests/cases/fourslash/cancellationWhenfindingAllRefsOnDefinition.ts @@ -23,8 +23,6 @@ ////second.start(); ////second.stop(); -diagnostics.setEditValidation(IncrementalEditValidation.None); - goTo.file("findAllRefsOnDefinition-import.ts"); goTo.marker("1"); @@ -38,4 +36,3 @@ verifyOperationIsCancelled(() => verify.referencesCountIs(0) ); cancellation.resetCancelled(); goTo.marker("1"); verify.referencesCountIs(2); - diff --git a/tests/cases/fourslash/cloduleAsBaseClass.ts b/tests/cases/fourslash/cloduleAsBaseClass.ts index c1ecc4aa44..19bd3bb53e 100644 --- a/tests/cases/fourslash/cloduleAsBaseClass.ts +++ b/tests/cases/fourslash/cloduleAsBaseClass.ts @@ -26,8 +26,6 @@ // this line triggers a semantic/syntactic error check, remove line when 788570 is fixed edit.insert(''); -diagnostics.setTypingFidelity(TypingFidelity.High); - goTo.marker('1'); verify.completionListContains('foo'); verify.completionListContains('foo2'); diff --git a/tests/cases/fourslash/cloduleAsBaseClass2.ts b/tests/cases/fourslash/cloduleAsBaseClass2.ts index 775b00939f..be2072afc4 100644 --- a/tests/cases/fourslash/cloduleAsBaseClass2.ts +++ b/tests/cases/fourslash/cloduleAsBaseClass2.ts @@ -30,7 +30,6 @@ // this line triggers a semantic/syntactic error check, remove line when 788570 is fixed edit.insert(''); -diagnostics.setTypingFidelity(TypingFidelity.High); goTo.marker('1'); verify.completionListContains('foo'); diff --git a/tests/cases/fourslash/completionBeforeSemanticDiagnosticsInArrowFunction1.ts b/tests/cases/fourslash/completionBeforeSemanticDiagnosticsInArrowFunction1.ts index bc0aa71388..16d2efcd6d 100644 --- a/tests/cases/fourslash/completionBeforeSemanticDiagnosticsInArrowFunction1.ts +++ b/tests/cases/fourslash/completionBeforeSemanticDiagnosticsInArrowFunction1.ts @@ -3,9 +3,6 @@ //// var f4 = (x: T/**/ ) => { //// } -// Turn off edit validation. We don't want semantic diagnostics to run until we explicit call it. -fs.diagnostics.setEditValidation(IncrementalEditValidation.None); - fs.goTo.marker(); // Replace the "T" type with the non-existent type 'V'. diff --git a/tests/cases/fourslash/completionEntryForPrimitive.ts b/tests/cases/fourslash/completionEntryForPrimitive.ts index c749379c86..9562e87926 100644 --- a/tests/cases/fourslash/completionEntryForPrimitive.ts +++ b/tests/cases/fourslash/completionEntryForPrimitive.ts @@ -2,7 +2,6 @@ ////var x = Object.create(/**/ -diagnostics.setEditValidation(IncrementalEditValidation.None); goTo.marker(); verify.not.completionListIsEmpty(); edit.insert("nu"); diff --git a/tests/cases/fourslash/errorsAfterResolvingVariableDeclOfMergedVariableAndClassDecl.ts b/tests/cases/fourslash/errorsAfterResolvingVariableDeclOfMergedVariableAndClassDecl.ts index 9287414584..58cddff3df 100644 --- a/tests/cases/fourslash/errorsAfterResolvingVariableDeclOfMergedVariableAndClassDecl.ts +++ b/tests/cases/fourslash/errorsAfterResolvingVariableDeclOfMergedVariableAndClassDecl.ts @@ -10,8 +10,6 @@ //// } ////} -diagnostics.setEditValidation(IncrementalEditValidation.None); - verify.numberOfErrorsInCurrentFile(0); // Edit and bind and resolve only var decl diff --git a/tests/cases/fourslash/findAllRefsOnDefinition.ts b/tests/cases/fourslash/findAllRefsOnDefinition.ts index b1a7552c8d..34144b7489 100644 --- a/tests/cases/fourslash/findAllRefsOnDefinition.ts +++ b/tests/cases/fourslash/findAllRefsOnDefinition.ts @@ -23,8 +23,6 @@ ////second.start(); ////second.stop(); -diagnostics.setEditValidation(IncrementalEditValidation.None); - goTo.file("findAllRefsOnDefinition-import.ts"); goTo.marker("1"); diff --git a/tests/cases/fourslash/findAllRefsOnDefinition2.ts b/tests/cases/fourslash/findAllRefsOnDefinition2.ts index 2b1d1668bb..1c03d392e4 100644 --- a/tests/cases/fourslash/findAllRefsOnDefinition2.ts +++ b/tests/cases/fourslash/findAllRefsOnDefinition2.ts @@ -14,8 +14,6 @@ ////var start: Second.Test.start; ////var stop: Second.Test.stop; -diagnostics.setEditValidation(IncrementalEditValidation.None); - goTo.file("findAllRefsOnDefinition2-import.ts"); goTo.marker("1"); diff --git a/tests/cases/fourslash/fourslash.ts b/tests/cases/fourslash/fourslash.ts index 85197dd3cc..f5a582868e 100644 --- a/tests/cases/fourslash/fourslash.ts +++ b/tests/cases/fourslash/fourslash.ts @@ -31,19 +31,6 @@ declare var FourSlash; -enum IncrementalEditValidation { - None = FourSlash.IncrementalEditValidation.None, - SyntacticOnly = FourSlash.IncrementalEditValidation.SyntacticOnly, - Complete = FourSlash.IncrementalEditValidation.Complete -} - -enum TypingFidelity { - /** Performs typing and formatting (if formatting is enabled) */ - Low = FourSlash.TypingFidelity.Low, - /** Performs typing, checks completion lists, signature help, and formatting (if enabled) */ - High = FourSlash.TypingFidelity.High -} - // Return code used by getEmitOutput function to indicate status of the function // It is a duplicate of the one in types.ts to expose it to testcases in fourslash enum EmitReturnStatus { @@ -101,14 +88,6 @@ module FourSlashInterface { public validateTypesAtPositions(...positions: number[]) { return FourSlash.currentTestState.verifyTypesAgainstFullCheckAtPositions(positions); } - - public setEditValidation(validation: IncrementalEditValidation) { - FourSlash.currentTestState.editValidation = validation; - } - - public setTypingFidelity(fidelity: TypingFidelity) { - FourSlash.currentTestState.typingFidelity = fidelity; - } } export class goTo { diff --git a/tests/cases/fourslash/getCompletionEntryDetails.ts b/tests/cases/fourslash/getCompletionEntryDetails.ts index 4746546457..078e84cf55 100644 --- a/tests/cases/fourslash/getCompletionEntryDetails.ts +++ b/tests/cases/fourslash/getCompletionEntryDetails.ts @@ -7,9 +7,6 @@ ////var bbb: string; /////*1*/ -// Disable test triggered type check -diagnostics.setEditValidation(IncrementalEditValidation.None); - goTo.marker("1"); verify.completionListContains("aaa"); verify.completionListContains("bbb"); diff --git a/tests/cases/fourslash/incrementalEditInvocationExpressionAboveInterfaceDeclaration.ts b/tests/cases/fourslash/incrementalEditInvocationExpressionAboveInterfaceDeclaration.ts index 8a06efbaa4..78152983df 100644 --- a/tests/cases/fourslash/incrementalEditInvocationExpressionAboveInterfaceDeclaration.ts +++ b/tests/cases/fourslash/incrementalEditInvocationExpressionAboveInterfaceDeclaration.ts @@ -4,9 +4,7 @@ /////*1*/ ////interface Foo { //// setISO8601(dString): Date; -////} - -diagnostics.setEditValidation(IncrementalEditValidation.None); +////} // Do resolve without typeCheck goTo.marker('1'); @@ -14,4 +12,4 @@ edit.insert("alert("); verify.currentSignatureHelpIs("alert(message?: any): void"); // TypeCheck -verify.errorExistsAfterMarker('1'); +verify.errorExistsAfterMarker('1'); \ No newline at end of file diff --git a/tests/cases/fourslash/incrementalParsing1.ts b/tests/cases/fourslash/incrementalParsing1.ts index 4d9078bf10..e09e96c9e0 100644 --- a/tests/cases/fourslash/incrementalParsing1.ts +++ b/tests/cases/fourslash/incrementalParsing1.ts @@ -20,7 +20,5 @@ // Force a syntax tree ot be created. verify.noMatchingBracePositionInCurrentFile(0); -// make sure we check the tree after every edit. -diagnostics.setTypingFidelity(TypingFidelity.High); goTo.marker('1'); edit.insert('Fo'); diff --git a/tests/cases/fourslash/incrementalResolveAccessor.ts b/tests/cases/fourslash/incrementalResolveAccessor.ts index 92c00f353c..812146398f 100644 --- a/tests/cases/fourslash/incrementalResolveAccessor.ts +++ b/tests/cases/fourslash/incrementalResolveAccessor.ts @@ -9,10 +9,8 @@ //// } ////} ////var val = new c1(); -////var b = val.p1; -/////*1*/b; - -diagnostics.setEditValidation(IncrementalEditValidation.None); +////var b = val.p1; +/////*1*/b; // Resolve without typeCheck goTo.marker('1'); diff --git a/tests/cases/fourslash/incrementalResolveConstructorDeclaration.ts b/tests/cases/fourslash/incrementalResolveConstructorDeclaration.ts index fd0c9efd8a..3eb5163124 100644 --- a/tests/cases/fourslash/incrementalResolveConstructorDeclaration.ts +++ b/tests/cases/fourslash/incrementalResolveConstructorDeclaration.ts @@ -7,9 +7,7 @@ //// } ////} ////var val = new c1("hello"); -/////*1*/val; - -diagnostics.setEditValidation(IncrementalEditValidation.None); +/////*1*/val; // Do resolve without typeCheck goTo.marker('1'); diff --git a/tests/cases/fourslash/incrementalResolveFunctionPropertyAssignment.ts b/tests/cases/fourslash/incrementalResolveFunctionPropertyAssignment.ts index 0799279c6e..c7a9c28c57 100644 --- a/tests/cases/fourslash/incrementalResolveFunctionPropertyAssignment.ts +++ b/tests/cases/fourslash/incrementalResolveFunctionPropertyAssignment.ts @@ -19,13 +19,10 @@ //// }); ////} ////var val = foo(["myString1", "myString2"]); -/////*1*/val; +/////*1*/val; -diagnostics.setEditValidation(IncrementalEditValidation.None); - -// Do resolve without typeCheck goTo.marker('1'); verify.quickInfoIs("(var) val: string"); // TypeCheck -verify.numberOfErrorsInCurrentFile(1); +verify.numberOfErrorsInCurrentFile(1); \ No newline at end of file diff --git a/tests/cases/fourslash/quickInfoOnMergedInterfaces.ts b/tests/cases/fourslash/quickInfoOnMergedInterfaces.ts index 7d6e7ef3f2..a8e6e292d4 100644 --- a/tests/cases/fourslash/quickInfoOnMergedInterfaces.ts +++ b/tests/cases/fourslash/quickInfoOnMergedInterfaces.ts @@ -16,7 +16,5 @@ //// var /*1*/r4 = a(1, true); ////} -diagnostics.setEditValidation(IncrementalEditValidation.None); - goTo.marker('1'); -verify.quickInfoIs("(var) r4: number"); +verify.quickInfoIs("(var) r4: number"); \ No newline at end of file diff --git a/tests/cases/fourslash/quickInfoOnMergedInterfacesWithIncrementalEdits.ts b/tests/cases/fourslash/quickInfoOnMergedInterfacesWithIncrementalEdits.ts index 5f6b348308..c08c16f1b6 100644 --- a/tests/cases/fourslash/quickInfoOnMergedInterfacesWithIncrementalEdits.ts +++ b/tests/cases/fourslash/quickInfoOnMergedInterfacesWithIncrementalEdits.ts @@ -12,8 +12,6 @@ //// var r/*2*/4 = b.b/*1*/ar; // string ////} -diagnostics.setEditValidation(IncrementalEditValidation.None); - goTo.marker('1'); verify.quickInfoIs("(property) B.bar: string", undefined); edit.deleteAtCaret(1); diff --git a/tests/cases/fourslash/quickInfoOnMergedModule.ts b/tests/cases/fourslash/quickInfoOnMergedModule.ts index abf12a65db..d968283234 100644 --- a/tests/cases/fourslash/quickInfoOnMergedModule.ts +++ b/tests/cases/fourslash/quickInfoOnMergedModule.ts @@ -15,8 +15,6 @@ //// var r = a.fo/*1*/o + a.bar; ////} -diagnostics.setEditValidation(IncrementalEditValidation.None); - goTo.marker('1'); verify.quickInfoIs("(property) M2.A.foo: string", undefined); verify.numberOfErrorsInCurrentFile(0); \ No newline at end of file diff --git a/tests/cases/fourslash/quickInfoOnUnResolvedBaseConstructorSignature.ts b/tests/cases/fourslash/quickInfoOnUnResolvedBaseConstructorSignature.ts index 224803110b..d76f9906df 100644 --- a/tests/cases/fourslash/quickInfoOnUnResolvedBaseConstructorSignature.ts +++ b/tests/cases/fourslash/quickInfoOnUnResolvedBaseConstructorSignature.ts @@ -10,6 +10,5 @@ ////} ////new class/*1*/InheritingSpecializedClass(); -diagnostics.setEditValidation(IncrementalEditValidation.None); goTo.marker('1'); verify.quickInfoExists(); \ No newline at end of file diff --git a/tests/cases/fourslash/signatureHelpInFunctionCallOnFunctionDeclarationInMultipleFiles.ts b/tests/cases/fourslash/signatureHelpInFunctionCallOnFunctionDeclarationInMultipleFiles.ts index 2339af0252..846c2d5244 100644 --- a/tests/cases/fourslash/signatureHelpInFunctionCallOnFunctionDeclarationInMultipleFiles.ts +++ b/tests/cases/fourslash/signatureHelpInFunctionCallOnFunctionDeclarationInMultipleFiles.ts @@ -2,13 +2,12 @@ // @Filename: signatureHelpInFunctionCallOnFunctionDeclarationInMultipleFiles_file0.ts ////declare function fn(x: string, y: number); - + // @Filename: signatureHelpInFunctionCallOnFunctionDeclarationInMultipleFiles_file1.ts ////declare function fn(x: string); - + // @Filename: signatureHelpInFunctionCallOnFunctionDeclarationInMultipleFiles_file2.ts -////fn(/*1*/ - -diagnostics.setEditValidation(IncrementalEditValidation.None); -goTo.marker('1'); +////fn(/*1*/ + +goTo.marker('1'); verify.signatureHelpCountIs(2); \ No newline at end of file diff --git a/tests/cases/fourslash/signatureHelpOnSuperWhenMembersAreNotResolved.ts b/tests/cases/fourslash/signatureHelpOnSuperWhenMembersAreNotResolved.ts index 5613ca71a7..dcb1463510 100644 --- a/tests/cases/fourslash/signatureHelpOnSuperWhenMembersAreNotResolved.ts +++ b/tests/cases/fourslash/signatureHelpOnSuperWhenMembersAreNotResolved.ts @@ -8,7 +8,6 @@ //// } ////} -diagnostics.setEditValidation(IncrementalEditValidation.None); goTo.marker("1"); edit.insert("super("); verify.currentSignatureHelpIs("B(x: string): B"); \ No newline at end of file diff --git a/tests/cases/fourslash/typeCheckAfterAddingGenericParameter.ts b/tests/cases/fourslash/typeCheckAfterAddingGenericParameter.ts index 3ee2b00fe3..e2e978dd7e 100644 --- a/tests/cases/fourslash/typeCheckAfterAddingGenericParameter.ts +++ b/tests/cases/fourslash/typeCheckAfterAddingGenericParameter.ts @@ -13,8 +13,6 @@ //// } //// -diagnostics.setEditValidation(IncrementalEditValidation.SyntacticOnly); - goTo.marker('addParam'); edit.insert(", X"); diff --git a/tests/cases/fourslash/typeCheckAfterResolve.ts b/tests/cases/fourslash/typeCheckAfterResolve.ts index 21ea8f8835..788721c072 100644 --- a/tests/cases/fourslash/typeCheckAfterResolve.ts +++ b/tests/cases/fourslash/typeCheckAfterResolve.ts @@ -1,28 +1,25 @@ -/// - +/// + /////*start*/class Point implements /*IPointRef*/IPoint { //// getDist() { //// ssss; //// } -////}/*end*/ - -// make sure no typeCheck is triggered after edit -diagnostics.setEditValidation(IncrementalEditValidation.None); - -// Edit to invalidate the intial typeCheck state -goTo.eof(); -edit.insertLine(""); - -// Attempt to resolve a symbol -goTo.marker("IPointRef"); -verify.quickInfoIs(""); // not found - -// trigger typecheck after the partial resolve, we should see errors -verify.errorExistsAfterMarker("IPointRef"); - -goTo.eof(); -edit.insertLine(""); - -// one more time with full typecheck -verify.errorExistsAfterMarker("IPointRef"); - +////}/*end*/ + +// Edit to invalidate the intial typeCheck state +goTo.eof(); +edit.insertLine(""); + +// Attempt to resolve a symbol +goTo.marker("IPointRef"); +verify.quickInfoIs(""); // not found + +// trigger typecheck after the partial resolve, we should see errors +verify.errorExistsAfterMarker("IPointRef"); + +goTo.eof(); +edit.insertLine(""); + +// one more time with full typecheck +verify.errorExistsAfterMarker("IPointRef"); + From 2bb0eb604bb95db67aaf55f800a228207a75d95a Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Sun, 14 Dec 2014 12:04:18 -0800 Subject: [PATCH 6/6] Ensure the 'hasParseErrors' bit is the same between trees. --- src/harness/harness.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/harness/harness.ts b/src/harness/harness.ts index edc0aa4902..471261ef1f 100644 --- a/src/harness/harness.ts +++ b/src/harness/harness.ts @@ -302,6 +302,10 @@ module Utils { assert.equal(node1.end, node2.end, "node1.end !== node2.end"); assert.equal(node1.kind, node2.kind, "node1.kind !== node2.kind"); assert.equal(node1.flags, node2.flags, "node1.flags !== node2.flags"); + + // call this on both nodes to ensure all propagated flags have been set (and thus can be + // compared). + assert.equal(ts.containsParseError(node1), ts.containsParseError(node2)); assert.equal(node1.parserContextFlags, node2.parserContextFlags, "node1.parserContextFlags !== node2.parserContextFlags"); ts.forEachChild(node1,