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

fix(organizeImports): Correctly parse script type #360

Merged
merged 5 commits into from Dec 11, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
24 changes: 12 additions & 12 deletions package.json
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
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
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
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
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
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
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
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
@@ -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
@@ -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