Skip to content
This repository has been archived by the owner on Feb 9, 2019. It is now read-only.

Commit

Permalink
Code
Browse files Browse the repository at this point in the history
  • Loading branch information
vhakulinen committed Apr 14, 2016
1 parent 3ca5e3c commit 2bb4476
Show file tree
Hide file tree
Showing 10 changed files with 681 additions and 0 deletions.
16 changes: 16 additions & 0 deletions neovim-intellij-complete.iml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PLUGIN_MODULE" version="4">
<component name="DevKit.ModuleBuildProperties" url="file://$MODULE_DIR$/resources/META-INF/plugin.xml" />
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/resources" type="java-resource" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="module" module-name="neovim-intellij-client" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.7.0" level="project" />
<orderEntry type="module" module-name="neovim-java-client" />
</component>
</module>
36 changes: 36 additions & 0 deletions resources/META-INF/plugin.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<idea-plugin version="2">
<id>NeovimIntellijComplete</id>
<name>NeovimIntellijComplete</name>
<version>1.0</version>
<vendor email="support@yourcompany.com" url="http://www.yourcompany.com">YourCompany</vendor>

<description><![CDATA[
Enter short description for your plugin here.<br>
<em>most HTML tags may be used</em>
]]></description>

<change-notes><![CDATA[
Add change notes here.<br>
<em>most HTML tags may be used</em>
]]>
</change-notes>

<!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/build_number_ranges.html for description -->
<idea-version since-build="141.0"/>

<!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/plugin_compatibility.html
on how to target different products -->
<!-- uncomment to enable plugin in all products
<depends>com.intellij.modules.lang</depends>
-->

<extensions defaultExtensionNs="com.intellij">
<!-- Add your extensions here -->
</extensions>

<actions>
<!-- Add your actions here -->
<action id="NeovimIntellijComplete" class="NeovimIntellijComplete" text="NeovimIntellijComplete" description="NeovimIntellijComplete"/>
</actions>

</idea-plugin>
36 changes: 36 additions & 0 deletions src/CodeInspector.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@

import com.intellij.analysis.AnalysisScope;
import com.intellij.codeInsight.daemon.impl.DefaultHighlightInfoProcessor;
import com.intellij.codeInsight.daemon.impl.LocalInspectionsPass;
import com.intellij.codeInspection.InspectionManager;
import com.intellij.codeInspection.InspectionProfile;
import com.intellij.codeInspection.ex.GlobalInspectionContextImpl;
import com.intellij.codeInspection.ex.InspectionManagerEx;
import com.intellij.codeInspection.ex.InspectionToolWrapper;
import com.intellij.openapi.editor.Document;
import com.intellij.profile.codeInspection.InspectionProfileManager;
import com.intellij.psi.PsiFile;

import java.util.Arrays;
import java.util.List;

public class CodeInspector {
public static List<Problem> inspect(PsiFile file) {
// TODO: See the internals InspectionApplication.run()
InspectionManagerEx manager = (InspectionManagerEx)InspectionManager.getInstance(file.getProject());
InspectionProfileManager profileManager = InspectionProfileManager.getInstance();
InspectionProfile profile = (InspectionProfile)profileManager.getProfile(manager.getCurrentProfile(), false);
InspectionToolWrapper[] tools = profile.getInspectionTools(null);
GlobalInspectionContextImpl context = manager.createNewGlobalContext(true);
AnalysisScope scope = new AnalysisScope(file);
Document document = file.getViewProvider().getDocument();
LocalInspectionsPass pass = new LocalInspectionsPass(file, document, 0, file.getTextLength(), LocalInspectionsPass.EMPTY_PRIORITY_RANGE,
true, new DefaultHighlightInfoProcessor());
return Arrays.asList(
new Problem(10, 4, "Undefined name 'foo'"),
new Problem(12, 6, "Undefined name 'bar'")
);
}
}


24 changes: 24 additions & 0 deletions src/DeopleteHelper.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import java.util.ArrayList;
import java.util.List;

public class DeopleteHelper {
private List<DeopleteItem> items;

public DeopleteHelper() {
items = new ArrayList<DeopleteItem>();
}

public void add(String word, String info, String kind) {
for (DeopleteItem i : items) {
if (i.getWord().equals(word)) {
i.appendInfo(word + info);
break;
}
}
items.add(new DeopleteItem(word, word + info, kind));
}

public DeopleteItem[] getItems() {
return items.toArray(new DeopleteItem[]{});
}
}
37 changes: 37 additions & 0 deletions src/DeopleteItem.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import com.fasterxml.jackson.annotation.JsonProperty;

public class DeopleteItem {

@JsonProperty
private String word;
@JsonProperty
private String info;
@JsonProperty
private String kind;

public DeopleteItem(
String word,
String info,
String kind) {
this.word = word;
this.info = info;
this.kind = kind;
}

public String getWord() {
return word;
}

public String getInfo() {
return info;
}

// Appends info with Strings and newline
public void appendInfo(String s) {
this.info += '\n' + s;
}

public String getKind() {
return kind;
}
}
98 changes: 98 additions & 0 deletions src/EmbeditorRequestHandler.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@

import com.intellij.codeInsight.completion.CompletionParameters;
import com.intellij.codeInsight.completion.CompletionProgressIndicator;
import com.intellij.codeInsight.completion.PrioritizedLookupElement;
import com.intellij.codeInsight.completion.SmartCompletionDecorator;
import com.intellij.codeInsight.lookup.Lookup;
import com.intellij.codeInsight.lookup.LookupElement;
import com.intellij.codeInsight.lookup.LookupElementPresentation;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.util.Ref;
import com.intellij.openapi.util.UserDataHolderBase;
import com.intellij.psi.PsiFile;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.keyFMap.KeyFMap;
import com.intellij.util.ui.UIUtil;
import org.jetbrains.annotations.NotNull;
import com.intellij.openapi.util.Key;

import java.util.Collection;
import java.util.Hashtable;
import java.util.List;

@SuppressWarnings("UnusedDeclaration")
public class EmbeditorRequestHandler {
private final static Logger LOG = Logger.getInstance(EmbeditorRequestHandler.class);

public Hashtable[] resolve(String path, String fileContent, int line, int column) {
LOG.debug(String.format("resolve(%s:%d:%d)", path, line, column));
List<ResolveOutcome> resolveOutcomes = EmbeditorUtil.getResolveOutcomes(path, fileContent, line, column);
Hashtable[] results = new Hashtable[resolveOutcomes.size()];
for (int i = 0; i < resolveOutcomes.size(); i++) {
ResolveOutcome resolveOutcome = resolveOutcomes.get(i);
Hashtable<String, Object> result = new Hashtable<String, Object>();
result.put("path", resolveOutcome.getFilePath());
result.put("line", resolveOutcome.getRow());
result.put("column", resolveOutcome.getColumn());
result.put("text", resolveOutcome.getText());
results[i] = result;
}
return results;
}

public int getCompletionStartOffsetInLine(String path, String fileContent, int line, int column) {
LOG.debug(String.format("getCompletionStartOffsetInLine(%s:%d:%d)", path, line, column));
final Ref<Integer> integerRef = Ref.create(0);
EmbeditorUtil.performCompletion(path, fileContent, line, column, new EmbeditorUtil.CompletionCallback() {
@Override
public void completionFinished(@NotNull CompletionParameters parameters,
@NotNull CompletionProgressIndicator indicator,
@NotNull Document document) {
integerRef.set(EmbeditorUtil.getOffsetFromLineStart(parameters, document));
}
});
return integerRef.get();
}

public LookupElement[] getCompletionVariants(String path, String fileContent, int line, int column) {
LOG.debug(String.format("getCompletionVariants(%s:%d:%d)", path, line, column));
final Collection<LookupElement> completionVariants = ContainerUtil.newLinkedList();
EmbeditorUtil.performCompletion(path, fileContent, line, column, new EmbeditorUtil.CompletionCallback() {
@Override
public void completionFinished(@NotNull CompletionParameters parameters,
@NotNull CompletionProgressIndicator indicator,
@NotNull Document document) {
for (LookupElement item : indicator.getLookup().getItems()) {
//completionVariants.add(item.getUserData(key).toString().replace("\u0000###", "").replace("###", ""));
completionVariants.add(item);
}
}
});
return completionVariants.toArray(new LookupElement[completionVariants.size()]);
}

public Hashtable[] inspectCode(final String path, String fileContent) {
final Hashtable[][] resultsWrapper = new Hashtable[1][];
UIUtil.invokeAndWaitIfNeeded(new Runnable() {
@Override
public void run() {
PsiFile file = EmbeditorUtil.findTargetFile(path);
if (file != null) {
List<Problem> problems = CodeInspector.inspect(file);
Hashtable[] results = new Hashtable[problems.size()];
for (int i = 0; i < problems.size(); i++) {
Problem problem = problems.get(i);
Hashtable<String, Object> result = new Hashtable<String, Object>();
result.put("line", problem.getLine());
result.put("column", problem.getColumn());
result.put("text", problem.getText());
results[i] = result;
}
resultsWrapper[0] = results;
}
}
});
return resultsWrapper[0];
}
}
Loading

0 comments on commit 2bb4476

Please sign in to comment.