From d790879709d971fb427d4870642791695b1326ad Mon Sep 17 00:00:00 2001 From: Piotr Tomiak Date: Mon, 26 Jan 2015 13:32:10 +0100 Subject: [PATCH] Asynchronous requests to Tern Server (Issue #171) Additional changes: - refactoring of completion proposals collection - introduced a record object to hold all information relevant to a completion item - refactoring of collectors API - collection algorithms have been moved out of *TernServer classes and placed in singletons --- .../core/CustomAngularModulesRegistry.java | 23 +++++++-------- .../org/eclipse/angularjs/core/Module.java | 12 ++++---- .../eclipse/angularjs/core/ModulesFolder.java | 10 +++---- .../JSAngularCompletionProposal.java | 23 ++++++++------- .../MarkupAngularCompletionProposal.java | 22 +++++++------- .../taginfo/HTMLAngularTernTypeCollector.java | 11 +++---- ...AngularTagsCompletionProposalComputer.java | 29 ++++++++++--------- 7 files changed, 67 insertions(+), 63 deletions(-) diff --git a/org.eclipse.angularjs.core/src/org/eclipse/angularjs/core/CustomAngularModulesRegistry.java b/org.eclipse.angularjs.core/src/org/eclipse/angularjs/core/CustomAngularModulesRegistry.java index b175931..73f029c 100644 --- a/org.eclipse.angularjs.core/src/org/eclipse/angularjs/core/CustomAngularModulesRegistry.java +++ b/org.eclipse.angularjs.core/src/org/eclipse/angularjs/core/CustomAngularModulesRegistry.java @@ -36,8 +36,9 @@ import tern.angular.protocol.completions.TernAngularCompletionsQuery; import tern.eclipse.ide.core.IIDETernProject; import tern.eclipse.ide.core.TernCorePlugin; -import tern.server.ITernServer; +import tern.server.protocol.IJSONObjectHelper; import tern.server.protocol.completions.ITernCompletionCollector; +import tern.server.protocol.completions.TernCompletionProposalRec; public class CustomAngularModulesRegistry extends AbstractAngularModulesRegistry implements IResourceChangeListener, @@ -92,13 +93,11 @@ protected void refreshIfNeeded() { new ITernCompletionCollector() { @Override - public void addProposal(String name, - String displayName, String type, - String doc, String url, String origin, - int start, int end, boolean isProperty, - boolean isObjectKey, Object completion, - ITernServer ternServer) { - String moduleName = ternServer.getText( + public void addProposal( + TernCompletionProposalRec proposal, + Object completion, + IJSONObjectHelper jsonObjectHelper) { + String moduleName = jsonObjectHelper.getText( completion, "module"); if (!StringUtils.isEmpty(moduleName)) { tern.angular.modules.Module module = CustomAngularModulesRegistry.this @@ -109,12 +108,12 @@ public void addProposal(String name, } List tagsName = new ArrayList(); - String restrict = ternServer.getText( + String restrict = jsonObjectHelper.getText( completion, "restrict"); DirectiveValue directiveValue = DirectiveValue.none; - new Directive(name, AngularType.model, - null, tagsName, restrict, - directiveValue, module); + new Directive(proposal.name, + AngularType.model, null, tagsName, + restrict, directiveValue, module); } } diff --git a/org.eclipse.angularjs.core/src/org/eclipse/angularjs/core/Module.java b/org.eclipse.angularjs.core/src/org/eclipse/angularjs/core/Module.java index 4b947ac..658c785 100644 --- a/org.eclipse.angularjs.core/src/org/eclipse/angularjs/core/Module.java +++ b/org.eclipse.angularjs.core/src/org/eclipse/angularjs/core/Module.java @@ -18,7 +18,9 @@ import tern.angular.protocol.definition.TernAngularDefinitionQuery; import tern.scriptpath.ITernScriptPath; import tern.server.ITernServer; +import tern.server.protocol.IJSONObjectHelper; import tern.server.protocol.completions.ITernCompletionCollector; +import tern.server.protocol.completions.TernCompletionProposalRec; import tern.server.protocol.definition.ITernDefinitionCollector; public class Module extends BaseModel implements ITernCompletionCollector, @@ -49,13 +51,11 @@ public Object[] getAngularElements() { } @Override - public void addProposal(String name, String displayName, String type, - String doc, String url, String origin, int start, int end, - boolean isProperty, boolean isObjectKey, Object completion, - ITernServer ternServer) { - AngularType angularType = AngularType.get(ternServer.getText( + public void addProposal(TernCompletionProposalRec proposal, + Object completion, IJSONObjectHelper jsonObjectHelper) { + AngularType angularType = AngularType.get(jsonObjectHelper.getText( completion, "angularType")); - elements.add(new AngularElement(name, angularType, Module.this)); + elements.add(new AngularElement(proposal.name, angularType, Module.this)); } @Override diff --git a/org.eclipse.angularjs.core/src/org/eclipse/angularjs/core/ModulesFolder.java b/org.eclipse.angularjs.core/src/org/eclipse/angularjs/core/ModulesFolder.java index 6fddc03..dd8903d 100644 --- a/org.eclipse.angularjs.core/src/org/eclipse/angularjs/core/ModulesFolder.java +++ b/org.eclipse.angularjs.core/src/org/eclipse/angularjs/core/ModulesFolder.java @@ -17,7 +17,9 @@ import tern.angular.protocol.completions.TernAngularCompletionsQuery; import tern.scriptpath.ITernScriptPath; import tern.server.ITernServer; +import tern.server.protocol.IJSONObjectHelper; import tern.server.protocol.completions.ITernCompletionCollector; +import tern.server.protocol.completions.TernCompletionProposalRec; public class ModulesFolder extends BaseModel implements ITernCompletionCollector { @@ -41,10 +43,8 @@ public Object[] getModules() { } @Override - public void addProposal(String name, String displayName, String type, - String doc, String url, String origin, int start, int end, - boolean isProperty, boolean isObjectKey, Object completion, - ITernServer ternServer) { - modules.add(new Module(name, getScriptPath())); + public void addProposal(TernCompletionProposalRec proposal, + Object completion, IJSONObjectHelper jsonObjectHelper) { + modules.add(new Module(proposal.name, getScriptPath())); } } diff --git a/org.eclipse.angularjs.ui/src/org/eclipse/angularjs/internal/ui/contentassist/JSAngularCompletionProposal.java b/org.eclipse.angularjs.ui/src/org/eclipse/angularjs/internal/ui/contentassist/JSAngularCompletionProposal.java index add7b04..5bbd152 100644 --- a/org.eclipse.angularjs.ui/src/org/eclipse/angularjs/internal/ui/contentassist/JSAngularCompletionProposal.java +++ b/org.eclipse.angularjs.ui/src/org/eclipse/angularjs/internal/ui/contentassist/JSAngularCompletionProposal.java @@ -15,8 +15,9 @@ import org.eclipse.wst.xml.ui.internal.contentassist.XMLRelevanceConstants; import tern.angular.AngularType; +import tern.angular.protocol.completions.AngularCompletionProposalRec; import tern.eclipse.ide.ui.contentassist.JSTernCompletionProposal; -import tern.server.ITernServer; +import tern.server.protocol.IJSONObjectHelper; /** * Extrends JavaScript Tern completion proposal to display "module" and @@ -26,30 +27,30 @@ public class JSAngularCompletionProposal extends JSTernCompletionProposal implements IRelevanceCompletionProposal { - private final ITernServer ternServer; + private final IJSONObjectHelper jsonObjectHelper; private final Object completion; - public JSAngularCompletionProposal(String name, String type, String doc, - String url, String origin, Object completion, ITernServer server, - AngularType angularType, int startOffset) { - super(name, type, doc, url, origin, startOffset, startOffset); - this.ternServer = server; + public JSAngularCompletionProposal(AngularCompletionProposalRec proposal, + Object completion, IJSONObjectHelper jsonObjectHelper, + AngularType angularType) { + super(proposal); + this.jsonObjectHelper = jsonObjectHelper; this.completion = completion; super.setTriggerCharacters(new char[] { '.' }); } @Override public String getAdditionalProposalInfo() { - String module = ternServer.getText(completion, "module"); - String controller = ternServer.getText(completion, "controller"); + String module = jsonObjectHelper.getText(completion, "module"); + String controller = jsonObjectHelper.getText(completion, "controller"); return HTMLAngularPrinter .getAngularInfo(this, null, module, controller); } // @Override protected String getAdditionalProposalInfoTitle() { - String module = ternServer.getText(completion, "module"); - String controller = ternServer.getText(completion, "controller"); + String module = jsonObjectHelper.getText(completion, "module"); + String controller = jsonObjectHelper.getText(completion, "controller"); StringBuilder title = new StringBuilder(getName()); if (module != null || controller != null) { diff --git a/org.eclipse.angularjs.ui/src/org/eclipse/angularjs/internal/ui/contentassist/MarkupAngularCompletionProposal.java b/org.eclipse.angularjs.ui/src/org/eclipse/angularjs/internal/ui/contentassist/MarkupAngularCompletionProposal.java index a35c995..c38e9de 100644 --- a/org.eclipse.angularjs.ui/src/org/eclipse/angularjs/internal/ui/contentassist/MarkupAngularCompletionProposal.java +++ b/org.eclipse.angularjs.ui/src/org/eclipse/angularjs/internal/ui/contentassist/MarkupAngularCompletionProposal.java @@ -14,9 +14,10 @@ import org.eclipse.swt.widgets.Shell; import tern.angular.AngularType; +import tern.angular.protocol.completions.AngularCompletionProposalRec; import tern.eclipse.ide.ui.TernUIPlugin; import tern.eclipse.jface.contentassist.TernCompletionProposal; -import tern.server.ITernServer; +import tern.server.protocol.IJSONObjectHelper; /** * Extrends Tern completion proposal to display "module" and "controller" @@ -25,23 +26,22 @@ */ public class MarkupAngularCompletionProposal extends TernCompletionProposal { - private final ITernServer ternServer; + private final IJSONObjectHelper jsonObjectHelper; private final Object completion; - public MarkupAngularCompletionProposal(String name, String type, - String doc, String url, String origin, int start, int end, - Object completion, ITernServer server, AngularType angularType, - int startOffset) { - super(name, type, doc, url, origin, startOffset, startOffset); - this.ternServer = server; + public MarkupAngularCompletionProposal( + AngularCompletionProposalRec proposal, Object completion, + IJSONObjectHelper jsonObjectHelper, AngularType angularType) { + super(proposal); + this.jsonObjectHelper = jsonObjectHelper; this.completion = completion; } @Override public String getAdditionalProposalInfo() { - String module = ternServer.getText(completion, "module"); - String controller = ternServer.getText(completion, "controller"); - AngularType angularType = AngularType.get(ternServer.getText( + String module = jsonObjectHelper.getText(completion, "module"); + String controller = jsonObjectHelper.getText(completion, "controller"); + AngularType angularType = AngularType.get(jsonObjectHelper.getText( completion, "angularType")); return HTMLAngularPrinter.getAngularInfo(getType(), getName(), module, controller, angularType, super.getDoc(), getOrigin()); diff --git a/org.eclipse.angularjs.ui/src/org/eclipse/angularjs/internal/ui/taginfo/HTMLAngularTernTypeCollector.java b/org.eclipse.angularjs.ui/src/org/eclipse/angularjs/internal/ui/taginfo/HTMLAngularTernTypeCollector.java index 5ec836e..549d0f3 100644 --- a/org.eclipse.angularjs.ui/src/org/eclipse/angularjs/internal/ui/taginfo/HTMLAngularTernTypeCollector.java +++ b/org.eclipse.angularjs.ui/src/org/eclipse/angularjs/internal/ui/taginfo/HTMLAngularTernTypeCollector.java @@ -15,11 +15,12 @@ import tern.angular.AngularType; import tern.eclipse.ide.ui.hover.HTMLTernTypeCollector; import tern.server.ITernServer; +import tern.server.protocol.IJSONObjectHelper; import tern.server.protocol.type.ITernTypeCollector; /** * {@link ITernTypeCollector} implementation for HTML Angular type collector. - * + * */ public class HTMLAngularTernTypeCollector extends HTMLTernTypeCollector { @@ -28,11 +29,11 @@ public class HTMLAngularTernTypeCollector extends HTMLTernTypeCollector { @Override public void setType(String type, boolean guess, String name, String exprName, String doc, String url, String origin, - Object object, ITernServer ternServer) { + Object object, IJSONObjectHelper objectHelper) { if (name != null) { - String module = ternServer.getText(object, "module"); - String controller = ternServer.getText(object, "controller"); - AngularType angularType = AngularType.get(ternServer.getText( + String module = objectHelper.getText(object, "module"); + String controller = objectHelper.getText(object, "controller"); + AngularType angularType = AngularType.get(objectHelper.getText( object, "angularType")); this.info = HTMLAngularPrinter.getAngularInfo(type, name, module, controller, angularType, doc, origin); diff --git a/org.eclipse.angularjs.ui/src/org/eclipse/angularjs/ui/contentassist/HTMLAngularTagsCompletionProposalComputer.java b/org.eclipse.angularjs.ui/src/org/eclipse/angularjs/ui/contentassist/HTMLAngularTagsCompletionProposalComputer.java index b30eb34..0ff3ff0 100644 --- a/org.eclipse.angularjs.ui/src/org/eclipse/angularjs/ui/contentassist/HTMLAngularTagsCompletionProposalComputer.java +++ b/org.eclipse.angularjs.ui/src/org/eclipse/angularjs/ui/contentassist/HTMLAngularTagsCompletionProposalComputer.java @@ -57,13 +57,15 @@ import tern.angular.modules.IDirectiveParameterCollector; import tern.angular.modules.Restriction; import tern.angular.protocol.TernAngularQuery; +import tern.angular.protocol.completions.AngularCompletionProposalRec; import tern.angular.protocol.completions.TernAngularCompletionsQuery; import tern.eclipse.ide.core.IIDETernProject; import tern.eclipse.ide.core.TernCorePlugin; import tern.eclipse.ide.core.resources.TernDocumentFile; import tern.scriptpath.ITernScriptPath; -import tern.server.ITernServer; +import tern.server.protocol.IJSONObjectHelper; import tern.server.protocol.completions.ITernCompletionCollector; +import tern.server.protocol.completions.TernCompletionProposalRec; /** * Completion in HTML editor for : @@ -330,22 +332,20 @@ private void populateAngularProposals( ITernCompletionCollector collector = new ITernCompletionCollector() { @Override - public void addProposal(String name, String displayName, - String type, String doc, String url, String origin, - int start, int end, boolean isProperty, - boolean isObjectKey, Object completion, - ITernServer ternServer) { + public void addProposal(TernCompletionProposalRec proposalItem, + Object completion, IJSONObjectHelper jsonObjectHelper) { ICompletionProposal proposal = null; if (isModuleOrController(angularType)) { MarkupAngularCompletionProposal markupPproposal = new MarkupAngularCompletionProposal( - name, type, doc, url, origin, start, end, - completion, ternServer, angularType, - replacementOffset); + new AngularCompletionProposalRec(proposalItem, + replacementOffset), completion, + jsonObjectHelper, angularType); // in the case of "module", "controller" completion // the value must replace the existing value. - String replacementString = "\"" + name + "\""; + String replacementString = "\"" + proposalItem.name + + "\""; int replacementLength = contentAssistRequest .getReplacementLength(); int cursorPosition = getCursorPositionForProposedText(replacementString) - 2; @@ -357,9 +357,12 @@ public void addProposal(String name, String displayName, .getImage(angularType)); proposal = markupPproposal; } else { - proposal = new JSAngularCompletionProposal(name, type, - doc, url, origin, completion, ternServer, - angularType, replacementOffset - (end - start)); + proposal = new JSAngularCompletionProposal( + new AngularCompletionProposalRec( + proposalItem, + replacementOffset + - (proposalItem.end - proposalItem.start)), + completion, jsonObjectHelper, angularType); } contentAssistRequest.addProposal(proposal);