Skip to content

Commit 08056ba

Browse files
authored
LSP improvements (#1152)
* consume jassdoc * make wurst.dependencies obsolete
1 parent a536990 commit 08056ba

25 files changed

Lines changed: 2621 additions & 194 deletions

Wurstpack/wurstscript/grill.cmd

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,13 @@ rem Resolve script dir
1111
set "DIR=%~dp0"
1212

1313
set "JAVA=%DIR%wurst-runtime\bin\java.exe"
14-
set "GRILL_JAR=%DIR%grill\grill.jar"
14+
set "GRILL_JAR=%DIR%grill-cli\grill.jar"
1515

1616
if not exist "%GRILL_JAR%" (
1717
echo [grill] ERROR: Missing jar. Searched:
1818
echo %GRILL_JAR%
1919
rem fallback to ../grill if you want:
20-
set "GRILL_JAR=%DIR%..\grill\grill.jar"
20+
set "GRILL_JAR=%DIR%..\grill-cli\grill.jar"
2121
if not exist "%GRILL_JAR%" (
2222
echo %GRILL_JAR%
2323
goto :restore

de.peeeq.wurstscript/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ dependencies {
105105
implementation 'com.google.code.gson:gson:2.10.1'
106106
implementation 'commons-lang:commons-lang:2.6'
107107
implementation 'com.github.albfernandez:juniversalchardet:2.4.0'
108+
implementation 'org.xerial:sqlite-jdbc:3.46.1.3'
108109
implementation 'com.github.inwc3:jmpq3:29b55f2c32'
109110
implementation 'com.github.inwc3:wc3libs:cc49c8e63c'
110111
implementation('com.github.wurstscript:wurstsetup:393cf5ea39') {

de.peeeq.wurstscript/src/main/java/de/peeeq/wurstio/WurstCompilerJassImpl.java

Lines changed: 1 addition & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import com.google.common.base.Charsets;
44
import com.google.common.base.Preconditions;
5-
import com.google.common.collect.ImmutableList;
65
import com.google.common.collect.Lists;
76
import com.google.common.collect.Maps;
87
import com.google.common.collect.Sets;
@@ -41,7 +40,6 @@
4140

4241
import java.io.*;
4342
import java.lang.ref.WeakReference;
44-
import java.nio.charset.StandardCharsets;
4543
import java.util.*;
4644
import java.util.Map.Entry;
4745
import java.util.function.Function;
@@ -148,49 +146,12 @@ public void loadWurstFilesInDir(File dir) {
148146
loadWurstFilesInDir(f);
149147
} else if (Utils.isWurstFile(f)) {
150148
loadFile(f);
151-
} else if (f.getName().equals("wurst.dependencies")) {
152-
dependencies.addAll(checkDependencyFile(f, gui));
153149
} else if ((!mapFile.isPresent() || runArgs.isNoExtractMapScript()) && f.getName().equals("war3map.j")) {
154150
loadFile(f);
155151
}
156152
}
157153
}
158154

159-
public static ImmutableList<File> checkDependencyFile(File depFile, WurstGui gui) {
160-
List<String> lines;
161-
try {
162-
lines = Files.readLines(depFile, StandardCharsets.UTF_8);
163-
} catch (IOException e) {
164-
e.printStackTrace();
165-
throw new Error(e);
166-
}
167-
LineOffsets offsets = new LineOffsets();
168-
int lineNr = 0;
169-
int offset = 0;
170-
for (String line : lines) {
171-
offsets.set(lineNr, offset);
172-
lineNr++;
173-
offset += line.length() + 1;
174-
}
175-
offsets.set(lineNr, offset);
176-
lineNr = 0;
177-
ImmutableList.Builder<File> dependencies = ImmutableList.builder();
178-
for (String line : lines) {
179-
int lineOffset = offsets.get(lineNr);
180-
WPos pos = new WPos(depFile.getAbsolutePath(), offsets, lineOffset + 1, lineOffset + line.length() + 1);
181-
File folder = new File(line);
182-
if (!folder.exists()) {
183-
gui.sendError(new CompileError(pos, "Folder " + line + " not found."));
184-
} else if (!folder.isDirectory()) {
185-
gui.sendError(new CompileError(pos, line + " is not a folder."));
186-
} else {
187-
dependencies.add(folder);
188-
}
189-
lineNr++;
190-
}
191-
return dependencies.build();
192-
}
193-
194155
@Override
195156
public @Nullable WurstModel parseFiles() {
196157

@@ -220,10 +181,6 @@ public static ImmutableList<File> checkDependencyFile(File depFile, WurstGui gui
220181
} else {
221182
WLogger.info("No wurst folder found in " + relativeWurstDir);
222183
}
223-
File dependencyFile = new File(projectFolder, "wurst.dependencies");
224-
if (dependencyFile.exists()) {
225-
dependencies.addAll(checkDependencyFile(dependencyFile, gui));
226-
}
227184
addDependenciesFromFolder(projectFolder, dependencies);
228185
}
229186

@@ -373,7 +330,7 @@ private void resolveImport(Function<File, CompilationUnit> addCompilationUnit, S
373330
private CompilationUnit loadLibPackage(Function<File, CompilationUnit> addCompilationUnit, String imp) {
374331
File file = getLibs().get(imp);
375332
if (file == null) {
376-
gui.sendError(new CompileError(new WPos("", null, 0, 0), "Could not find lib-package " + imp + ". Are you missing your wurst.dependencies file?"));
333+
gui.sendError(new CompileError(new WPos("", null, 0, 0), "Could not find lib-package " + imp + ". Is your dependency present in _build/dependencies?"));
377334
return Ast.CompilationUnit(new CompilationUnitInfo(errorHandler), Ast.JassToplevelDeclarations(), Ast.WPackages());
378335
} else {
379336
return addCompilationUnit.apply(file);

de.peeeq.wurstscript/src/main/java/de/peeeq/wurstio/languageserver/BufferManager.java

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,12 @@ synchronized void handleFileChange(FileEvent fileEvent) {
4141
switch (fileEvent.getType()) {
4242
case Created:
4343
case Changed:
44-
readFileFromDisk(uri);
44+
readFileFromDisk(uri);
45+
break;
4546
case Deleted:
4647
currentBuffer.remove(uri);
48+
latestVersion.remove(uri);
49+
break;
4750
}
4851
}
4952

@@ -69,7 +72,8 @@ private String readFileFromDisk(WFile uri) {
6972

7073
synchronized void handleChange(DidChangeTextDocumentParams params) {
7174
WFile uri = WFile.create(params.getTextDocument().getUri());
72-
int version = params.getTextDocument().getVersion();
75+
Integer versionObj = params.getTextDocument().getVersion();
76+
int version = versionObj != null ? versionObj : getTextDocumentVersion(uri) + 1;
7377
if (version < getTextDocumentVersion(uri)) {
7478
// ignore old versions
7579
return;
@@ -84,26 +88,45 @@ synchronized void handleChange(DidChangeTextDocumentParams params) {
8488
} else {
8589
int start = getOffset(sb, contentChange.getRange().getStart());
8690
int end = getOffset(sb, contentChange.getRange().getEnd());
87-
sb.replace(start, end - start, contentChange.getText());
91+
if (end < start) {
92+
int tmp = start;
93+
start = end;
94+
end = tmp;
95+
}
96+
sb.replace(start, end, contentChange.getText());
8897
}
8998
}
9099
}
91100

101+
synchronized void handleOpen(DidOpenTextDocumentParams params) {
102+
TextDocumentItem item = params.getTextDocument();
103+
WFile uri = WFile.create(item.getUri());
104+
latestVersion.put(uri, item.getVersion());
105+
StringBuilder sb = buffer(uri);
106+
sb.replace(0, sb.length(), item.getText());
107+
}
108+
109+
synchronized void handleClose(DidCloseTextDocumentParams params) {
110+
WFile uri = WFile.create(params.getTextDocument().getUri());
111+
currentBuffer.remove(uri);
112+
latestVersion.remove(uri);
113+
}
114+
92115
public synchronized int getTextDocumentVersion(WFile uri) {
93116
return latestVersion.getOrDefault(uri, -1);
94117
}
95118

96119
private int getOffset(StringBuilder sb, Position position) {
97120
int pos = 0;
98-
int line = 1;
121+
int line = 0;
99122
while (pos < sb.length() && line < position.getLine()) {
100123
if (sb.charAt(pos) == '\n') {
101124
line++;
102125
}
103126
pos++;
104127
}
105-
pos += position.getCharacter();
106-
return Math.min(pos, sb.length() - 1);
128+
pos += Math.max(0, position.getCharacter());
129+
return Math.min(Math.max(0, pos), sb.length());
107130
}
108131

109132
synchronized public void updateFile(WFile wFile, String contents) {

de.peeeq.wurstscript/src/main/java/de/peeeq/wurstio/languageserver/Convert.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import org.eclipse.lsp4j.*;
77

88
import java.util.ArrayList;
9+
import java.util.Collections;
910
import java.util.List;
1011

1112
/**
@@ -76,7 +77,13 @@ public static PublishDiagnosticsParams createDiagnostics(String extra, WFile fil
7677
break;
7778

7879
}
79-
diagnostics.add(new Diagnostic(range, message, severity, "Wurst"));
80+
Diagnostic diagnostic = new Diagnostic(range, message, severity, "Wurst");
81+
diagnostic.setCode("WURST_" + err.getErrorType().name());
82+
String messageLower = message.toLowerCase();
83+
if (messageLower.contains("deprecated")) {
84+
diagnostic.setTags(Collections.singletonList(DiagnosticTag.Deprecated));
85+
}
86+
diagnostics.add(diagnostic);
8087
}
8188
return new PublishDiagnosticsParams(filename.getUriString(), diagnostics);
8289
}

0 commit comments

Comments
 (0)