Skip to content
This repository has been archived by the owner on Oct 10, 2018. It is now read-only.

Commit

Permalink
fix(organizeImports): Correctly parse script type (#360)
Browse files Browse the repository at this point in the history
Warning, this disables the travis tests.
  • Loading branch information
buehler authored Dec 11, 2017
1 parent 85e044d commit 5050d0c
Show file tree
Hide file tree
Showing 11 changed files with 213 additions and 1,061 deletions.
24 changes: 12 additions & 12 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -65,31 +65,31 @@
"build": "del-cli ./out && tsc -p ./config/tsconfig.build.json"
},
"devDependencies": {
"@types/chai": "^4.0.4",
"@types/chai": "^4.0.8",
"@types/mocha": "^2.2.44",
"@types/node": "^8.0.47",
"@types/node": "^8.0.57",
"@types/reflect-metadata": "0.0.5",
"@types/sinon": "^2.3.7",
"@types/sinon": "^4.1.0",
"@types/sinon-chai": "^2.7.29",
"chai": "^4.1.2",
"cross-env": "^5.1.1",
"del-cli": "^1.1.0",
"filewalker": "^0.1.3",
"mocha-testdata": "^1.2.0",
"sinon": "^4.0.2",
"sinon": "^4.1.3",
"sinon-chai": "^2.14.0",
"tslint": "^5.8.0",
"tslint-config-airbnb": "^5.3.0",
"tsutils": "^2.12.1",
"vscode": "^1.1.6"
"tslint-config-airbnb": "^5.4.2",
"tsutils": "^2.13.0",
"vscode": "^1.1.10"
},
"dependencies": {
"inversify": "^4.3.0",
"inversify-inject-decorators": "^3.0.1",
"inversify": "^4.6.0",
"inversify-inject-decorators": "^3.0.2",
"reflect-metadata": "^0.1.10",
"tslib": "^1.8.0",
"typescript": "~2.6.1",
"typescript-parser": "^2.2.1",
"tslib": "^1.8.1",
"typescript": "~2.6.2",
"typescript-parser": "^2.2.2",
"winston": "^3.0.0-rc1"
},
"activationEvents": [
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { Command, Diagnostic, TextDocument, workspace } from 'vscode';
import { getAbsolutLibraryName } from '../../common/helpers';
import { iocSymbols } from '../IoCSymbols';
import { DeclarationIndexMapper } from '../utilities/DeclarationIndexMapper';
import { getScriptKind } from '../utilities/utilityFunctions';
import { Logger } from '../utilities/winstonLogger';
import { ImplementPolymorphElements, NoopCodeAction } from './CodeAction';
import { CodeActionCreator } from './CodeActionCreator';
Expand Down Expand Up @@ -78,7 +79,7 @@ export class MissingImplementationInClassCreator extends CodeActionCreator {
types = genericMatch[2].split(',').map(t => t.trim());
}

const parsedDocument = await this.parser.parseSource(document.getText());
const parsedDocument = await this.parser.parseSource(document.getText(), getScriptKind(document.fileName));
const alreadyImported = parsedDocument.imports.find(
o => o instanceof NamedImport && o.specifiers.some(s => s.specifier === specifier),
);
Expand Down
4 changes: 2 additions & 2 deletions src/extension/extensions/CodeCompletionExtension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import { getDeclarationsFilteredByImports } from '../../common/helpers';
import { iocSymbols } from '../IoCSymbols';
import { ImportManager } from '../managers/ImportManager';
import { DeclarationIndexMapper } from '../utilities/DeclarationIndexMapper';
import { getItemKind } from '../utilities/utilityFunctions';
import { getItemKind, getScriptKind } from '../utilities/utilityFunctions';
import { Logger } from '../utilities/winstonLogger';
import { BaseExtension } from './BaseExtension';

Expand Down Expand Up @@ -133,7 +133,7 @@ export class CodeCompletionExtension extends BaseExtension implements Completion
);
const profiler = this.logger.startTimer();

const parsed = await this.parser.parseSource(document.getText());
const parsed = await this.parser.parseSource(document.getText(), getScriptKind(document.fileName));
const declarations = getDeclarationsFilteredByImports(
index.declarationInfos,
document.fileName,
Expand Down
6 changes: 5 additions & 1 deletion src/extension/extensions/DocumentSymbolStructureExtension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import { DisabledStructureTreeItem } from '../provider-items/document-structure/
import { ImportsStructureTreeItem } from '../provider-items/document-structure/ImportsStructureTreeItem';
import { NotParseableStructureTreeItem } from '../provider-items/document-structure/NotParseableStructureTreeItem';
import { ResourceStructureTreeItem } from '../provider-items/document-structure/ResourceStructureTreeItem';
import { getScriptKind } from '../utilities/utilityFunctions';
import { Logger } from '../utilities/winstonLogger';
import { BaseExtension } from './BaseExtension';

Expand Down Expand Up @@ -101,7 +102,10 @@ export class DocumentSymbolStructureExtension extends BaseExtension implements T

if (!this.documentCache) {
try {
this.documentCache = await this.parser.parseSource(window.activeTextEditor.document.getText());
this.documentCache = await this.parser.parseSource(
window.activeTextEditor.document.getText(),
getScriptKind(window.activeTextEditor.document.fileName),
);
} catch (e) {
this.logger.error(
'[%s] document could not be parsed, error: %s',
Expand Down
5 changes: 3 additions & 2 deletions src/extension/extensions/ImportResolveExtension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { ResolveQuickPickItem } from '../../common/quick-pick-items';
import { iocSymbols } from '../IoCSymbols';
import { ImportManager } from '../managers';
import { DeclarationIndexMapper } from '../utilities/DeclarationIndexMapper';
import { getScriptKind } from '../utilities/utilityFunctions';
import { Logger } from '../utilities/winstonLogger';
import { BaseExtension } from './BaseExtension';

Expand Down Expand Up @@ -349,7 +350,7 @@ export class ImportResolveExtension extends BaseExtension {
{ cursorSymbol, file: documentPath },
);

const parsedSource = await this.parser.parseSource(documentSource);
const parsedSource = await this.parser.parseSource(documentSource, getScriptKind(documentPath));
const activeDocumentDeclarations = parsedSource.declarations.map(o => o.name);
const declarations = getDeclarationsFilteredByImports(
index.declarationInfos,
Expand Down Expand Up @@ -394,7 +395,7 @@ export class ImportResolveExtension extends BaseExtension {
{ file: documentPath },
);

const parsedDocument = await this.parser.parseSource(documentSource);
const parsedDocument = await this.parser.parseSource(documentSource, getScriptKind(documentPath));
const missingDeclarations: (DeclarationInfo)[] = [];
const declarations = getDeclarationsFilteredByImports(
index.declarationInfos,
Expand Down
3 changes: 2 additions & 1 deletion src/extension/managers/ClassManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import { TypescriptCodeGeneratorFactory } from '../../common/factories';
import { Container } from '../IoC';
import { iocSymbols } from '../IoCSymbols';
import { Changeable } from '../proxy-objects/Changeable';
import { getScriptKind } from '../utilities/utilityFunctions';
import { Logger } from '../utilities/winstonLogger';
import { ObjectManager } from './ObjectManager';

Expand Down Expand Up @@ -104,7 +105,7 @@ export class ClassManager implements ObjectManager {
* @memberof ClassManager
*/
public static async create(document: TextDocument, className: string): Promise<ClassManager> {
const source = await ClassManager.parser.parseSource(document.getText());
const source = await ClassManager.parser.parseSource(document.getText(), getScriptKind(document.fileName));
const managedClass = source.declarations.find(
o => o.name === className && o instanceof ClassDeclaration,
) as ClassDeclaration;
Expand Down
8 changes: 6 additions & 2 deletions src/extension/managers/ImportManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ import { ImportGroup } from '../import-grouping';
import { Container } from '../IoC';
import { iocSymbols } from '../IoCSymbols';
import {
getScriptKind,
importGroupSortForPrecedence,
importSort,
importSortByFirstSpecifier,
Expand Down Expand Up @@ -123,7 +124,7 @@ export class ImportManager implements ObjectManager {
* @memberof ImportManager
*/
public static async create(document: TextDocument): Promise<ImportManager> {
const source = await ImportManager.parser.parseSource(document.getText());
const source = await ImportManager.parser.parseSource(document.getText(), getScriptKind(document.fileName));
return new ImportManager(document, source);
}

Expand Down Expand Up @@ -324,7 +325,10 @@ export class ImportManager implements ObjectManager {

if (result) {
delete this.organize;
this._parsedDocument = await ImportManager.parser.parseSource(this.document.getText());
this._parsedDocument = await ImportManager.parser.parseSource(
this.document.getText(),
getScriptKind(this.document.fileName),
);
this.imports = this._parsedDocument.imports.map(o => o.clone());
for (const group of this.importGroups) {
group.reset();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,8 @@ export class ImportStructureTreeItem extends BaseStructureTreeItem {
const imp = this.tsImport;
if (imp instanceof ExternalModuleImport) {
return [new ImportSpecifierStructureTreeItem(imp.alias, imp, this.context)];
} else if (imp instanceof NamedImport) {
}
if (imp instanceof NamedImport) {
const specifiers = imp.specifiers.map(
s => new ImportSpecifierStructureTreeItem(
`${s.specifier}${s.alias ? ` as ${s.alias}` : ''}`,
Expand All @@ -53,7 +54,8 @@ export class ImportStructureTreeItem extends BaseStructureTreeItem {
}

return specifiers;
} else if (imp instanceof NamespaceImport) {
}
if (imp instanceof NamespaceImport) {
return [new ImportSpecifierStructureTreeItem(imp.alias, imp, this.context)];
}
return [];
Expand Down
32 changes: 30 additions & 2 deletions src/extension/utilities/utilityFunctions.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { ImportGroup, RegexImportGroup } from '../import-grouping';
import { basename } from 'path';
import { basename, parse } from 'path';
import { ScriptKind } from 'typescript';
import {
ClassDeclaration,
ConstructorDeclaration,
Expand All @@ -25,6 +25,8 @@ import {
} from 'typescript-parser';
import { CompletionItemKind } from 'vscode';

import { ImportGroup, RegexImportGroup } from '../import-grouping';

/**
* String-Sort function.
*
Expand Down Expand Up @@ -201,3 +203,29 @@ export function getItemKind(declaration: Declaration): CompletionItemKind {
return CompletionItemKind.Reference;
}
}

/**
* Calculates the scriptkind for the typescript parser based on filepath.
*
* @export
* @param {string} filePath
* @returns {ScriptKind}
*/
export function getScriptKind(filePath: string | undefined): ScriptKind {
if (!filePath) {
return ScriptKind.TS;
}
const parsed = parse(filePath);
switch (parsed.ext) {
case '.ts':
return ScriptKind.TS;
case '.tsx':
return ScriptKind.TSX;
case '.js':
return ScriptKind.JS;
case '.jsx':
return ScriptKind.JSX;
default:
return ScriptKind.Unknown;
}
}
51 changes: 25 additions & 26 deletions src/extension/utilities/winstonLogger.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { join } from 'path';
import { ExtensionContext, OutputChannel, window, workspace } from 'vscode';
import { ExtensionContext, OutputChannel, window } from 'vscode';

const { createLogger, exceptions, format, transports } = require('winston');
const transport = require('winston-transport');
Expand Down Expand Up @@ -55,30 +54,30 @@ class ConsoleLogTransport extends Transport {
}
}

class HandleUncatchedException extends Transport {
constructor(private path: string) {
super();
}

public async log(info: any, callback: any): Promise<void> {
setImmediate(() => {
this.emit('logged', info);
});

const result = await window.showErrorMessage(
'There was an uncaught exception, do you want to see the logfile?',
{ modal: true },
'Yes, show me.',
);

if (result) {
const doc = await workspace.openTextDocument(join(this.path, 'typescript-hero.log'));
await window.showTextDocument(doc);
}

callback();
}
}
// class HandleUncatchedException extends Transport {
// constructor(private path: string) {
// super();
// }

// public async log(info: any, callback: any): Promise<void> {
// setImmediate(() => {
// this.emit('logged', info);
// });

// const result = await window.showErrorMessage(
// 'There was an uncaught exception, do you want to see the logfile?',
// { modal: true },
// 'Yes, show me.',
// );

// if (result) {
// const doc = await workspace.openTextDocument(join(this.path, 'typescript-hero.log'));
// await window.showTextDocument(doc);
// }

// callback();
// }
// }

export interface Logger {
error: (message: string, ...data: any[]) => void;
Expand Down
Loading

0 comments on commit 5050d0c

Please sign in to comment.