Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix #12 #36

Merged
merged 11 commits into from
Jan 11, 2019
15 changes: 15 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,12 @@
"command": "namespaceResolver.sort",
"alt": "namespaceResolver.sort",
"group": "0_namespace_resolver@3"
},
{
"when": "resourceLangId == php",
"command": "namespaceResolver.importall",
"alt": "namespaceResolver.importall",
"group": "0_namespace_resolver@4"
}
]
},
Expand Down Expand Up @@ -107,6 +113,10 @@
{
"title": "Sort Imports",
"command": "namespaceResolver.sort"
},
{
"title": "Import All Classes",
"command": "namespaceResolver.importall"
}
],
"keybindings": [
Expand All @@ -124,6 +134,11 @@
"command": "namespaceResolver.sort",
"key": "ctrl+alt+s",
"when": "editorTextFocus"
},
{
"command": "namespaceResolver.importall",
"key": "ctrl+alt+a",
"when": "editorTextFocus"
}
]
},
Expand Down
73 changes: 73 additions & 0 deletions src/Resolver.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,75 @@ class Resolver {
this.importClass(selection, fqcn, replaceClassAfterImport);
}

async importAll() {
const text = this.activeEditor().document.getText();
let matches = [];
let regex = /.*/;

let phpClasses = this.getPhpClasses(text);

for (let phpClass of phpClasses) {
await this.importCommand(phpClass);
}
}

getPhpClasses(text) {
let phpClasses = this.getExtended(text);
phpClasses = phpClasses.concat(this.getFromFunctionParameters(text));
phpClasses = phpClasses.concat(this.getInitializedWithNew(text));
phpClasses = phpClasses.concat(this.getFromStaticCalls(text));

// get unique class names only
phpClasses = phpClasses.filter((v, i, a) => a.indexOf(v) === i);
return phpClasses;
}

getExtended(text) {
let regex = /extends ([A-Z][A-Za-z0-9\-\_]*)/gm;
let matches = [];
let phpClasses = [];
while (matches = regex.exec(text)) {
phpClasses.push(matches[1]);
}
return phpClasses;
}

getFromFunctionParameters(text) {
let regex = /function [\S]+\((.*)\)/gm;
let matches = [];
let phpClasses = [];
while (matches = regex.exec(text)) {
let parameters = matches[1].split(', ');
for (let s of parameters) {
let phpClassName = s.substr(0, s.indexOf(' '));
if (phpClassName && /[A-Z]/.test(phpClassName[0])) { //starts with capital letter
phpClasses.push(phpClassName);
}
}
}
return phpClasses;
}

getInitializedWithNew(text) {
let regex = /new ([A-Z][A-Za-z0-9\-\_]*)/gm;
let matches = [];
let phpClasses = [];
while (matches = regex.exec(text)) {
phpClasses.push(matches[1]);
}
return phpClasses;
}

getFromStaticCalls(text) {
let regex = /([A-Z][A-Za-z0-9\-\_]*)::/gm;
let matches = [];
let phpClasses = [];
while (matches = regex.exec(text)) {
phpClasses.push(matches[1]);
}
return phpClasses;
}

importClass(selection, fqcn, replaceClassAfterImport = false) {
let useStatements, declarationLines;

Expand Down Expand Up @@ -360,6 +429,10 @@ class Resolver {
}

resolving(selection) {
if ((typeof selection) == 'string') {
return selection;
}

let wordRange = this.activeEditor().document.getWordRangeAtPosition(selection.active);

if (wordRange === undefined) {
Expand Down
4 changes: 4 additions & 0 deletions src/extension.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,10 @@ function activate(context) {
vscode.commands.registerCommand('namespaceResolver.sort', () => resolver.sortCommand())
);

context.subscriptions.push(
vscode.commands.registerCommand('namespaceResolver.importall', () => resolver.importAll())
);

context.subscriptions.push(vscode.workspace.onWillSaveTextDocument((event) => {
if (
event.document.languageId === 'php' &&
Expand Down