Skip to content

Commit 2fe7582

Browse files
committed
Add compiletime natives for map name and build date
See MagicFunctions package in the standard library. wurstscript/WurstStdlib2@80ea0d0
1 parent 5adbb95 commit 2fe7582

File tree

9 files changed

+38
-18
lines changed

9 files changed

+38
-18
lines changed

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,7 @@ public CompilationProcess(WurstGui gui, RunArgs runArgs) {
8484
() -> runTests(compiler.getImTranslator(), compiler, runArgs.getTestTimeout()));
8585
}
8686

87-
timeTaker.measure("Run compiletime functions",
88-
compiler::runCompiletime);
87+
timeTaker.measure("Run compiletime functions", () ->compiler.runCompiletime(null));
8988

9089
JassProg jassProg = timeTaker.measure("Transform program to Jass",
9190
compiler::transformProgToJass);

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.google.common.collect.ArrayListMultimap;
55
import com.google.common.collect.Lists;
66
import com.google.common.collect.Maps;
7+
import config.WurstProjectConfigData;
78
import de.peeeq.wurstio.intermediateLang.interpreter.CompiletimeNatives;
89
import de.peeeq.wurstio.intermediateLang.interpreter.ProgramStateIO;
910
import de.peeeq.wurstio.jassinterpreter.InterpreterException;
@@ -79,15 +80,15 @@ public boolean matches(ImFunction f) {
7980

8081

8182
public CompiletimeFunctionRunner(
82-
ImTranslator tr, ImProg imProg, Optional<File> mapFile, MpqEditor mpqEditor, WurstGui gui,
83-
FunctionFlagToRun flag) {
83+
ImTranslator tr, ImProg imProg, Optional<File> mapFile, MpqEditor mpqEditor, WurstGui gui,
84+
FunctionFlagToRun flag, WurstProjectConfigData projectConfigData) {
8485
Preconditions.checkNotNull(imProg);
8586
this.translator = tr;
8687
this.imProg = imProg;
8788
globalState = new ProgramStateIO(mapFile, mpqEditor, gui, imProg, true);
8889
this.interpreter = new ILInterpreter(imProg, gui, mapFile, globalState);
8990

90-
interpreter.addNativeProvider(new CompiletimeNatives(globalState));
91+
interpreter.addNativeProvider(new CompiletimeNatives(globalState, projectConfigData));
9192
interpreter.addNativeProvider(new ReflectionNativeProvider(interpreter));
9293
this.gui = gui;
9394
this.functionFlag = flag;

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.google.common.base.Preconditions;
55
import com.google.common.collect.*;
66
import com.google.common.io.Files;
7+
import config.WurstProjectConfigData;
78
import de.peeeq.wurstio.languageserver.requests.RequestFailedException;
89
import de.peeeq.wurstio.map.importer.ImportFile;
910
import de.peeeq.wurstio.mpq.MpqEditor;
@@ -99,13 +100,13 @@ public void loadFiles(File... files) {
99100
}
100101

101102
@Override
102-
public void runCompiletime() {
103+
public void runCompiletime(WurstProjectConfigData projectConfigData) {
103104
if (runArgs.runCompiletimeFunctions()) {
104105
// compile & inject object-editor data
105106
// TODO run optimizations later?
106107
gui.sendProgress("Running compiletime functions");
107108
CompiletimeFunctionRunner ctr = new CompiletimeFunctionRunner(imTranslator, getImProg(), getMapFile(), getMapfileMpqEditor(), gui,
108-
CompiletimeFunctions);
109+
CompiletimeFunctions, projectConfigData);
109110
ctr.setInjectObjects(runArgs.isInjectObjects());
110111
ctr.setOutputStream(new PrintStream(System.err));
111112
ctr.run();

de.peeeq.wurstscript/src/main/java/de/peeeq/wurstio/intermediateLang/interpreter/CompiletimeNatives.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package de.peeeq.wurstio.intermediateLang.interpreter;
22

33

4+
import config.WurstProjectConfigData;
45
import de.peeeq.wurstio.jassinterpreter.InterpreterException;
56
import de.peeeq.wurstio.jassinterpreter.ReflectionBasedNativeProvider;
67
import de.peeeq.wurstio.objectreader.*;
@@ -12,12 +13,19 @@
1213
import de.peeeq.wurstscript.intermediatelang.interpreter.ProgramState;
1314
import de.peeeq.wurstscript.intermediatelang.interpreter.VariableType;
1415

16+
import java.text.SimpleDateFormat;
17+
import java.time.LocalDateTime;
18+
import java.time.temporal.ChronoUnit;
19+
import java.time.temporal.TemporalUnit;
20+
1521
@SuppressWarnings("ucd") // ignore unused code detector warnings, because this class uses reflection
1622
public class CompiletimeNatives extends ReflectionBasedNativeProvider implements NativesProvider {
1723
private ProgramStateIO globalState;
24+
private WurstProjectConfigData projectConfigData;
1825

19-
public CompiletimeNatives(ProgramStateIO globalState) {
26+
public CompiletimeNatives(ProgramStateIO globalState, WurstProjectConfigData projectConfigData) {
2027
this.globalState = globalState;
28+
this.projectConfigData = projectConfigData;
2129
}
2230

2331

@@ -133,4 +141,11 @@ public void compileError(ILconstString msg) {
133141
throw new InterpreterException(msg.getVal());
134142
}
135143

144+
public ILconstString getMapName() {
145+
return new ILconstString(projectConfigData.getBuildMapData().getName());
146+
}
147+
148+
public ILconstString getBuildDate() {
149+
return new ILconstString(LocalDateTime.now().truncatedTo(ChronoUnit.MINUTES).toString());
150+
}
136151
}

de.peeeq.wurstscript/src/main/java/de/peeeq/wurstio/languageserver/requests/BuildMap.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ public Object execute(ModelManager modelManager) throws IOException {
6161
String fileName = projectConfig.getBuildMapData().getFileName();
6262
Optional<File> targetMap = Optional.of(
6363
new File(buildDir, fileName.isEmpty() ? projectConfig.getProjectName() + ".w3x" : fileName + ".w3x"));
64-
File compiledScript = compileScript(modelManager, gui, targetMap);
64+
File compiledScript = compileScript(modelManager, gui, targetMap, projectConfig);
6565

6666
gui.sendProgress("Applying Map Config...");
6767
ProjectConfigBuilder.apply(projectConfig, targetMap.get(), compiledScript, buildDir, runArgs, w3data);

de.peeeq.wurstscript/src/main/java/de/peeeq/wurstio/languageserver/requests/MapRequest.java

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.google.common.base.Charsets;
44
import com.google.common.io.Files;
5+
import config.WurstProjectConfigData;
56
import de.peeeq.wurstio.Pjass;
67
import de.peeeq.wurstio.UtilsIO;
78
import de.peeeq.wurstio.WurstCompilerJassImpl;
@@ -140,7 +141,8 @@ protected void processMapScript(
140141
modelManager.syncCompilationUnit(WFile.create(existingScript));
141142
}
142143

143-
protected File compileMap(File projectFolder, WurstGui gui, Optional<File> mapCopy, RunArgs runArgs, WurstModel model) {
144+
protected File compileMap(File projectFolder, WurstGui gui, Optional<File> mapCopy, RunArgs runArgs, WurstModel model,
145+
WurstProjectConfigData projectConfigData) {
144146
try (@Nullable MpqEditor mpqEditor = MpqEditorFactory.getEditor(mapCopy)) {
145147
if (mpqEditor != null && !mpqEditor.canWrite()) {
146148
WLogger.severe("The supplied map is invalid/corrupted/protected and Wurst cannot write to it.\n" +
@@ -166,7 +168,7 @@ protected File compileMap(File projectFolder, WurstGui gui, Optional<File> mapCo
166168
}
167169

168170

169-
compiler.runCompiletime();
171+
compiler.runCompiletime(projectConfigData);
170172

171173
if (runArgs.isLua()) {
172174
print("translating program to Lua ... ");
@@ -314,7 +316,8 @@ protected void println(String s) {
314316
}
315317

316318

317-
protected File compileScript(WurstGui gui, ModelManager modelManager, List<String> compileArgs, Optional<File> mapCopy) throws Exception {
319+
protected File compileScript(WurstGui gui, ModelManager modelManager, List<String> compileArgs, Optional<File> mapCopy,
320+
WurstProjectConfigData projectConfigData) throws Exception {
318321
RunArgs runArgs = new RunArgs(compileArgs);
319322
print("Compile Script : ");
320323
for (File dep : modelManager.getDependencyWurstFiles()) {
@@ -345,10 +348,10 @@ protected File compileScript(WurstGui gui, ModelManager modelManager, List<Strin
345348
model = ModelManager.copy(model);
346349
}
347350

348-
return compileMap(modelManager.getProjectPath(), gui, mapCopy, runArgs, model);
351+
return compileMap(modelManager.getProjectPath(), gui, mapCopy, runArgs, model, projectConfigData);
349352
}
350353

351-
protected File compileScript(ModelManager modelManager, WurstGui gui, Optional<File> testMap) throws Exception {
354+
protected File compileScript(ModelManager modelManager, WurstGui gui, Optional<File> testMap, WurstProjectConfigData projectConfigData) throws Exception {
352355
if (testMap.isPresent() && testMap.get().exists()) {
353356
boolean deleteOk = testMap.get().delete();
354357
if (!deleteOk) {
@@ -360,7 +363,7 @@ protected File compileScript(ModelManager modelManager, WurstGui gui, Optional<F
360363
}
361364

362365
// first compile the script:
363-
File compiledScript = compileScript(gui, modelManager, compileArgs, testMap);
366+
File compiledScript = compileScript(gui, modelManager, compileArgs, testMap, projectConfigData);
364367

365368
Optional<WurstModel> model = Optional.ofNullable(modelManager.getModel());
366369
if (!model.isPresent()

de.peeeq.wurstscript/src/main/java/de/peeeq/wurstio/languageserver/requests/RunMap.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ public Object execute(ModelManager modelManager) throws IOException {
8484
// first we copy in same location to ensure validity
8585
File buildDir = getBuildDir();
8686
Optional<File> testMap = map.map($ -> new File(buildDir, "WurstRunMap.w3x"));
87-
File compiledScript = compileScript(modelManager, gui, testMap);
87+
File compiledScript = compileScript(modelManager, gui, testMap, projectConfig);
8888

8989
if (runArgs.isHotReload()) {
9090
// call jhcr update

de.peeeq.wurstscript/src/main/java/de/peeeq/wurstio/languageserver/requests/RunTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ public TestResult runTests(ImTranslator translator, ImProg imProg, Optional<Func
147147
WurstGui gui = new TestGui();
148148

149149
CompiletimeFunctionRunner cfr = new CompiletimeFunctionRunner(translator, imProg, Optional.empty(), null, gui,
150-
CompiletimeFunctions);
150+
CompiletimeFunctions, null);
151151
ILInterpreter interpreter = cfr.getInterpreter();
152152
ProgramState globalState = cfr.getGlobalState();
153153
if (globalState == null) {

de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/WurstCompiler.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package de.peeeq.wurstscript;
22

3+
import config.WurstProjectConfigData;
34
import de.peeeq.wurstscript.ast.WurstModel;
45
import org.eclipse.jdt.annotation.Nullable;
56

@@ -14,5 +15,5 @@ public interface WurstCompiler {
1415

1516
void loadFiles(File... files);
1617

17-
void runCompiletime();
18+
void runCompiletime(WurstProjectConfigData projectConfigData);
1819
}

0 commit comments

Comments
 (0)