Skip to content

Commit 09fd36b

Browse files
committed
show parsing errors
initial commit that fetch parse failures from javaparser and show it to user when he try to add missing or remove unused imports. fix #367
1 parent 8abca8d commit 09fd36b

File tree

13 files changed

+196
-55
lines changed

13 files changed

+196
-55
lines changed

autoload/javacomplete/complete/complete.vim

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ function! javacomplete#complete#complete#Complete(findstart, base, is_filter)
2626
return
2727
endif
2828

29+
call javacomplete#highlights#Drop()
30+
2931
if a:findstart
3032
call s:Init()
3133
return javacomplete#complete#context#FindContext()

autoload/javacomplete/highlights.vim

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
" Vim completion script for java
2+
" Maintainer: artur shaik <ashaihullin@gmail.com>
3+
"
4+
" Work with attention highlights
5+
6+
let s:matchesCount = 0
7+
let s:signId = 271992
8+
sign define jc2signparseproblem text=->
9+
10+
function! s:Log(log)
11+
let log = type(a:log) == type("") ? a:log : string(a:log)
12+
call javacomplete#logger#Log("[highlights] ". log)
13+
endfunction
14+
15+
function! javacomplete#highlights#Drop()
16+
if s:matchesCount > 0 && !empty(getmatches())
17+
lclose
18+
exe "sign unplace * file=". expand("%:p")
19+
call clearmatches()
20+
call setloclist(0, [], 'f')
21+
let s:matchesCount = len(getmatches())
22+
endif
23+
endfunction
24+
25+
function! javacomplete#highlights#ShowProblems(problems)
26+
let loclist = []
27+
let matchposlist = []
28+
for problem in a:problems
29+
call extend(loclist,[{
30+
\ 'bufnr':bufnr('%'),
31+
\ 'lnum': problem['lnum'],
32+
\ 'col': problem['col'],
33+
\ 'text': problem['message']}])
34+
call add(matchposlist,[problem['lnum'], problem['col']])
35+
exe ":sign place ".s:signId." line=".problem['lnum'].
36+
\ " name=jc2signparseproblem file=" . expand("%:p")
37+
endfor
38+
if !empty(matchposlist)
39+
let s:matchesCount = len(matchposlist)
40+
call setloclist(0, loclist, 'r')
41+
call matchaddpos("SpellBad", matchposlist)
42+
lopen
43+
endif
44+
endfunction

autoload/javacomplete/imports.vim

Lines changed: 42 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -501,48 +501,63 @@ function! s:PopulateRegularClasses(classname, import)
501501
endfunction
502502

503503
function! javacomplete#imports#RemoveUnused()
504+
call javacomplete#highlights#Drop()
505+
504506
let currentBuf = getline(1,'$')
505507
let base64Content = javacomplete#util#Base64Encode(join(currentBuf, "\n"))
506508

507509
let response = javacomplete#server#Communicate('-unused-imports -content', base64Content, 'RemoveUnusedImports')
508-
if response =~ '^['
509-
let saveCursor = getpos('.')
510-
let unused = eval(response)
511-
for unusedImport in unused
512-
let imports = javacomplete#imports#GetImports('imports')
513-
if stridx(unusedImport, '$') != -1
514-
let unusedImport = 'static '. substitute(unusedImport, "\\$", ".", "")
515-
endif
516-
for import in imports
517-
if import[0] == unusedImport
518-
silent execute import[1]. 'delete _'
510+
if response =~ '^{'
511+
let response = eval(response)
512+
if has_key(response, 'imports')
513+
let saveCursor = getpos('.')
514+
let unusedImports = response['imports']
515+
for unusedImport in unusedImports
516+
let imports = javacomplete#imports#GetImports('imports')
517+
if stridx(unusedImport, '$') != -1
518+
let unusedImport = 'static '. substitute(unusedImport, "\\$", ".", "")
519519
endif
520+
for import in imports
521+
if import[0] == unusedImport
522+
silent execute import[1]. 'delete _'
523+
endif
524+
endfor
520525
endfor
521-
endfor
522-
let saveCursor[1] = saveCursor[1] - len(unused)
523-
call setpos('.', saveCursor)
526+
let saveCursor[1] = saveCursor[1] - len(unusedImports)
527+
call setpos('.', saveCursor)
528+
elseif has_key(response, 'parse-problems')
529+
call javacomplete#highlights#ShowProblems(response['parse-problems'])
530+
endif
524531
endif
525532
endfunction
526533

527534
function! javacomplete#imports#AddMissing()
535+
call javacomplete#highlights#Drop()
536+
528537
let currentBuf = getline(1,'$')
529538
let base64Content = javacomplete#util#Base64Encode(join(currentBuf, "\n"))
530539

531540
let response = javacomplete#server#Communicate('-missing-imports -content', base64Content, 'AddMissingImports')
532-
if response =~ '^['
533-
let missing = eval(response)
534-
for import in missing
535-
let classname = split(import[0], '\(\.\|\$\)')[-1]
536-
if index(keys(s:RegularClassesDict), classname) < 0
537-
let result = s:ChooseImportOption(import, classname)
538-
if !empty(result)
539-
call s:AddImport(result)
541+
if response =~ '^{'
542+
let response = eval(response)
543+
if has_key(response, 'imports')
544+
for import in response['imports']
545+
let classname = split(import[0], '\(\.\|\$\)')[-1]
546+
if index(keys(s:RegularClassesDict), classname) < 0
547+
let result = s:ChooseImportOption(import, classname)
548+
if !empty(result)
549+
call s:AddImport(result)
550+
endif
551+
else
552+
call s:AddImport(s:RegularClassesDict[classname])
540553
endif
541-
else
542-
call s:AddImport(s:RegularClassesDict[classname])
543-
endif
544-
endfor
545-
call javacomplete#imports#SortImports()
554+
endfor
555+
call javacomplete#imports#SortImports()
556+
elseif has_key(response, 'parse-problems')
557+
call javacomplete#highlights#ShowProblems(response['parse-problems'])
558+
endif
559+
else
560+
echo response
546561
endif
547562
endfunction
548563

autoload/javacomplete/server.vim

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ function! javacomplete#server#Communicate(option, args, log)
235235
call s:Log("communicate: ". cmd. " [". a:log. "]")
236236
let result = ""
237237
JavacompletePy << EOPC
238-
vim.command('let result = "%s"' % bridgeState.send(vim.eval("cmd")))
238+
vim.command('let result = "%s"' % bridgeState.send(vim.eval("cmd")).replace('"', '\\"'))
239239
EOPC
240240

241241
call s:Log(result)

autoload/javacomplete/version.vim

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"
44
" Version control
55

6-
let g:JavaComplete_ServerCompatibilityVersion = "2.3.10"
6+
let g:JavaComplete_ServerCompatibilityVersion = "2.3.11"
77

88
function! javacomplete#version#GetCompatibilityVerison()
99
return g:JavaComplete_ServerCompatibilityVersion

libs/javavi/src/main/java/kg/ash/javavi/Javavi.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
public class Javavi {
1212

13-
public static final String VERSION = "2.3.10";
13+
public static final String VERSION = "2.3.11";
1414

1515
public static String NEWLINE = "";
1616

libs/javavi/src/main/java/kg/ash/javavi/actions/GetMissingImportsAction.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public String action() {
4545
get().getName()));
4646
}
4747

48-
StringBuilder result = new StringBuilder("[");
48+
StringBuilder result = new StringBuilder("{'imports':[");
4949
for (String classname : classnames) {
5050
if (!importTails.contains(classname)) {
5151
GetClassPackagesAction getPackagesAction =
@@ -85,7 +85,7 @@ public String action() {
8585
}
8686
}
8787
}
88-
return result.append("]").toString();
88+
return result.append("]}").toString();
8989
}
9090

9191
private static String isolatePackage(String pkg) {

libs/javavi/src/main/java/kg/ash/javavi/actions/GetUnusedImportsAction.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,17 @@ public class GetUnusedImportsAction extends ImportsAction {
1010

1111
@Override
1212
public String action() {
13-
StringBuilder result = new StringBuilder("[");
14-
for (ImportDeclaration importDeclaration : compilationUnit.getImports()) {
13+
StringBuilder result = new StringBuilder("{'imports':[");
14+
for (ImportDeclaration importDeclaration :
15+
compilationUnit.getImports()) {
1516
if (importDeclaration.isAsterisk()) {
1617
continue;
1718
}
1819

19-
ClassImport classImport = new ClassImport(removeComments(importDeclaration.getName()),
20-
importDeclaration.isStatic(), importDeclaration.isAsterisk());
20+
ClassImport classImport = new ClassImport(
21+
removeComments(importDeclaration.getName()),
22+
importDeclaration.isStatic(),
23+
importDeclaration.isAsterisk());
2124

2225
String classname = classImport.getTail();
2326
if (!classnames.contains(classname)) {
@@ -28,11 +31,12 @@ public String action() {
2831
.append("',");
2932
}
3033
}
31-
return result.append("]").toString();
34+
return result.append("]}").toString();
3235
}
3336

3437
private static String removeComments(Node n) {
35-
PrettyPrinterConfiguration config = new PrettyPrinterConfiguration();
38+
PrettyPrinterConfiguration config =
39+
new PrettyPrinterConfiguration();
3640
config.setPrintComments(false);
3741
return new PrettyPrinter(config).print(n);
3842
}

libs/javavi/src/main/java/kg/ash/javavi/actions/ImportsAction.java

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.github.javaparser.ast.CompilationUnit;
44
import kg.ash.javavi.readers.source.ClassNamesFetcher;
55
import kg.ash.javavi.readers.source.CompilationUnitCreator;
6+
import kg.ash.javavi.readers.source.CompilationUnitResult;
67

78
import java.io.UnsupportedEncodingException;
89
import java.util.Base64;
@@ -18,14 +19,28 @@ public abstract class ImportsAction implements Action {
1819
public String perform(String[] args) {
1920
try {
2021
String base64Content = getContent(args);
21-
String content = new String(Base64.getDecoder().decode(base64Content), "UTF-8");
22+
String content = new String(
23+
Base64.getDecoder().decode(base64Content), "UTF-8");
2224

23-
compilationUnit = CompilationUnitCreator.createFromContent(content);
24-
if (compilationUnit == null) {
25+
CompilationUnitResult compilationUnitResult =
26+
CompilationUnitCreator.createFromContent(content);
27+
if (compilationUnitResult == null) {
2528
return "Couldn't parse file";
29+
} else if (compilationUnitResult.getProblems() != null) {
30+
StringBuilder result =
31+
new StringBuilder("{'parse-problems':[");
32+
compilationUnitResult.getProblems().stream().forEach(p -> {
33+
result.append("{'message':'").append(p.getMessage()).append("'");
34+
result.append(",'lnum':'").append(p.getLocation().get().getBegin().getRange().get().begin.line).append("'");
35+
result.append(",'col':'").append(p.getLocation().get().getBegin().getRange().get().begin.column).append("'},");
36+
});
37+
return result.append("]}").toString();
38+
} else {
39+
compilationUnit = compilationUnitResult.getCompilationUnit();
2640
}
2741

28-
ClassNamesFetcher classnamesFetcher = new ClassNamesFetcher(compilationUnit);
42+
ClassNamesFetcher classnamesFetcher =
43+
new ClassNamesFetcher(compilationUnit);
2944
classnames = classnamesFetcher.getNames();
3045
declarations = classnamesFetcher.getDeclarationList();
3146

libs/javavi/src/main/java/kg/ash/javavi/readers/Parser.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import kg.ash.javavi.clazz.SourceClass;
3535
import kg.ash.javavi.readers.source.ClassNamesFetcher;
3636
import kg.ash.javavi.readers.source.CompilationUnitCreator;
37+
import kg.ash.javavi.readers.source.CompilationUnitResult;
3738
import kg.ash.javavi.searchers.ClassSearcher;
3839
import kg.ash.javavi.searchers.FqnSearcher;
3940

@@ -82,12 +83,17 @@ public SourceClass read(String targetClass) {
8283
return Cache.getInstance().getClasses().get(targetClass);
8384
}
8485

85-
CompilationUnit cu = sourceFile != null
86+
CompilationUnitResult cur = sourceFile != null
8687
? CompilationUnitCreator.createFromFile(sourceFile)
8788
: CompilationUnitCreator.createFromContent(sourceContent);
8889

89-
if (cu == null) {
90+
CompilationUnit cu;
91+
if (cur == null) {
9092
return null;
93+
} else if (cur.getProblems() != null) {
94+
return null;
95+
} else {
96+
cu = cur.getCompilationUnit();
9197
}
9298

9399
SourceClass clazz = new SourceClass();

0 commit comments

Comments
 (0)