diff --git a/plugins/compiler/as-8080/build.gradle b/plugins/compiler/as-8080/build.gradle index 1a40f32dc..9e1405c42 100644 --- a/plugins/compiler/as-8080/build.gradle +++ b/plugins/compiler/as-8080/build.gradle @@ -23,6 +23,7 @@ plugins { id 'java' id 'idea' id 'antlr' + id 'com.adarshr.test-logger' version '3.1.0' } dependencies { diff --git a/plugins/compiler/as-8080/src/main/java/net/emustudio/plugins/compiler/as8080/LexicalAnalyzerImpl.java b/plugins/compiler/as-8080/src/main/java/net/emustudio/plugins/compiler/as8080/LexicalAnalyzerImpl.java index e6b697386..0e96795a2 100644 --- a/plugins/compiler/as-8080/src/main/java/net/emustudio/plugins/compiler/as8080/LexicalAnalyzerImpl.java +++ b/plugins/compiler/as-8080/src/main/java/net/emustudio/plugins/compiler/as8080/LexicalAnalyzerImpl.java @@ -200,6 +200,9 @@ public void reset(InputStream inputStream) throws IOException { } private int convertLexerTokenType(int tokenType) { + if (tokenType == EOF) { + return Token.EOF; + } return tokenMap[tokenType]; } } diff --git a/plugins/compiler/as-8080/src/main/java/net/emustudio/plugins/compiler/as8080/visitors/ExpandIncludesVisitor.java b/plugins/compiler/as-8080/src/main/java/net/emustudio/plugins/compiler/as8080/visitors/ExpandIncludesVisitor.java index 35f07c401..b1ba67ed0 100644 --- a/plugins/compiler/as-8080/src/main/java/net/emustudio/plugins/compiler/as8080/visitors/ExpandIncludesVisitor.java +++ b/plugins/compiler/as-8080/src/main/java/net/emustudio/plugins/compiler/as8080/visitors/ExpandIncludesVisitor.java @@ -8,11 +8,10 @@ import org.antlr.v4.runtime.CommonTokenStream; import org.antlr.v4.runtime.tree.ParseTree; +import java.io.File; import java.io.IOException; -import java.util.Collections; -import java.util.HashSet; -import java.util.Objects; -import java.util.Set; +import java.nio.file.Path; +import java.util.*; import static net.emustudio.plugins.compiler.as8080.CompileError.couldNotReadFile; import static net.emustudio.plugins.compiler.as8080.CompileError.infiniteLoopDetected; @@ -21,7 +20,8 @@ * Integrate "include" files and remove PseudoInclude */ public class ExpandIncludesVisitor extends NodeVisitor { - private final Set includedFiles; // TODO: windows platform case-insensitive! + private final Set includedFiles; + private Optional inputFileName = Optional.empty(); public ExpandIncludesVisitor() { this.includedFiles = Collections.emptySet(); @@ -31,6 +31,12 @@ public ExpandIncludesVisitor(Set includedFiles) { this.includedFiles = Objects.requireNonNull(includedFiles); } + @Override + public void visit(Program node) { + this.inputFileName = node.getFileName(); + super.visit(node); + } + @Override public void visit(PseudoInclude node) { if (includedFiles.contains(node.filename)) { @@ -38,13 +44,15 @@ public void visit(PseudoInclude node) { } try { - As8080Lexer lexer = new As8080Lexer(CharStreams.fromFileName(node.filename)); + String absoluteFileName = findAbsoluteFileName(node.filename); + + As8080Lexer lexer = new As8080Lexer(CharStreams.fromFileName(absoluteFileName)); CommonTokenStream stream = new CommonTokenStream(lexer); As8080Parser parser = new As8080Parser(stream); stream.fill(); ParseTree tree = parser.rStart(); Program program = new Program(node.line, node.column, env); - program.setFileName(node.filename); + program.setFileName(absoluteFileName); new CreateProgramVisitor(program).visit(tree); @@ -58,4 +66,20 @@ public void visit(PseudoInclude node) { error(couldNotReadFile(node, node.filename, e)); } } + + private String findAbsoluteFileName(String includeFileName) { + File includeFile = new File(includeFileName); + if (includeFile.isAbsolute()) { + return includeFileName; + } + + return inputFileName + .map(f -> f.replace("\\", File.separator)) + .map(File::new) + .map(File::getParentFile) + .map(File::toPath) + .map(p -> p.resolve(includeFileName)) + .map(Path::toString) + .orElse(includeFileName); + } } diff --git a/plugins/compiler/as-ssem/build.gradle b/plugins/compiler/as-ssem/build.gradle index 7c8f622e2..04b69a5fc 100644 --- a/plugins/compiler/as-ssem/build.gradle +++ b/plugins/compiler/as-ssem/build.gradle @@ -23,6 +23,7 @@ plugins { id 'java' id 'idea' id 'antlr' + id 'com.adarshr.test-logger' version '3.1.0' } dependencies { diff --git a/plugins/compiler/as-z80/build.gradle b/plugins/compiler/as-z80/build.gradle index b9f72a799..cdcc192a2 100644 --- a/plugins/compiler/as-z80/build.gradle +++ b/plugins/compiler/as-z80/build.gradle @@ -23,6 +23,7 @@ plugins { id 'java' id 'idea' id 'antlr' + id 'com.adarshr.test-logger' version '3.1.0' } dependencies { diff --git a/plugins/compiler/as-z80/src/main/java/net/emustudio/plugins/compiler/asZ80/AssemblerZ80.java b/plugins/compiler/as-z80/src/main/java/net/emustudio/plugins/compiler/asZ80/AssemblerZ80.java index 35c338e6c..e448faa67 100644 --- a/plugins/compiler/as-z80/src/main/java/net/emustudio/plugins/compiler/asZ80/AssemblerZ80.java +++ b/plugins/compiler/as-z80/src/main/java/net/emustudio/plugins/compiler/asZ80/AssemblerZ80.java @@ -118,6 +118,7 @@ public boolean compile(String inputFileName, String outputFileName) { parser.addErrorListener(new ParserErrorListener()); Program program = new Program(); + program.setFileName(inputFileName); new CreateProgramVisitor(program).visit(parser.rStart()); IntelHEX hex = new IntelHEX(); diff --git a/plugins/compiler/as-z80/src/main/java/net/emustudio/plugins/compiler/asZ80/ast/NameSpace.java b/plugins/compiler/as-z80/src/main/java/net/emustudio/plugins/compiler/asZ80/ast/NameSpace.java index 216d84faa..e1ae72521 100644 --- a/plugins/compiler/as-z80/src/main/java/net/emustudio/plugins/compiler/asZ80/ast/NameSpace.java +++ b/plugins/compiler/as-z80/src/main/java/net/emustudio/plugins/compiler/asZ80/ast/NameSpace.java @@ -2,6 +2,7 @@ import net.emustudio.plugins.compiler.asZ80.CompileError; +import java.io.File; import java.util.*; public class NameSpace { diff --git a/plugins/compiler/as-z80/src/main/java/net/emustudio/plugins/compiler/asZ80/visitors/ExpandIncludesVisitor.java b/plugins/compiler/as-z80/src/main/java/net/emustudio/plugins/compiler/asZ80/visitors/ExpandIncludesVisitor.java index e65fcbcae..693da2c7b 100644 --- a/plugins/compiler/as-z80/src/main/java/net/emustudio/plugins/compiler/asZ80/visitors/ExpandIncludesVisitor.java +++ b/plugins/compiler/as-z80/src/main/java/net/emustudio/plugins/compiler/asZ80/visitors/ExpandIncludesVisitor.java @@ -8,11 +8,10 @@ import org.antlr.v4.runtime.CommonTokenStream; import org.antlr.v4.runtime.tree.ParseTree; +import java.io.File; import java.io.IOException; -import java.util.Collections; -import java.util.HashSet; -import java.util.Objects; -import java.util.Set; +import java.nio.file.Path; +import java.util.*; import static net.emustudio.plugins.compiler.asZ80.CompileError.couldNotReadFile; import static net.emustudio.plugins.compiler.asZ80.CompileError.infiniteLoopDetected; @@ -21,8 +20,9 @@ * Integrate "include" files and remove PseudoInclude */ public class ExpandIncludesVisitor extends NodeVisitor { - private final Set includedFiles; // TODO: windows platform case-insensitive! - + private final Set includedFiles; + private Optional inputFileName = Optional.empty(); + public ExpandIncludesVisitor() { this.includedFiles = Collections.emptySet(); } @@ -31,6 +31,12 @@ public ExpandIncludesVisitor(Set includedFiles) { this.includedFiles = Objects.requireNonNull(includedFiles); } + @Override + public void visit(Program node) { + this.inputFileName = node.getFileName(); + super.visit(node); + } + @Override public void visit(PseudoInclude node) { if (includedFiles.contains(node.filename)) { @@ -38,13 +44,15 @@ public void visit(PseudoInclude node) { } try { - AsZ80Lexer lexer = new AsZ80Lexer(CharStreams.fromFileName(node.filename)); + String absoluteFileName = findAbsoluteFileName(node.filename); + + AsZ80Lexer lexer = new AsZ80Lexer(CharStreams.fromFileName(absoluteFileName)); CommonTokenStream stream = new CommonTokenStream(lexer); AsZ80Parser parser = new AsZ80Parser(stream); stream.fill(); ParseTree tree = parser.rStart(); Program program = new Program(node.line, node.column, env); - program.setFileName(node.filename); + program.setFileName(absoluteFileName); new CreateProgramVisitor(program).visit(tree); @@ -58,4 +66,20 @@ public void visit(PseudoInclude node) { error(couldNotReadFile(node, node.filename, e)); } } + + private String findAbsoluteFileName(String includeFileName) { + File includeFile = new File(includeFileName); + if (includeFile.isAbsolute()) { + return includeFileName; + } + + return inputFileName + .map(f -> f.replace("\\", File.separator)) + .map(File::new) + .map(File::getParentFile) + .map(File::toPath) + .map(p -> p.resolve(includeFileName)) + .map(Path::toString) + .orElse(includeFileName); + } } diff --git a/plugins/compiler/brainc-brainduck/build.gradle b/plugins/compiler/brainc-brainduck/build.gradle index 2f2296b6e..74c65ace3 100644 --- a/plugins/compiler/brainc-brainduck/build.gradle +++ b/plugins/compiler/brainc-brainduck/build.gradle @@ -23,6 +23,7 @@ plugins { id 'java' id 'org.xbib.gradle.plugin.jflex' version "1.5.0" id "com.github.andrescv.jcup" version "1.0" + id 'com.adarshr.test-logger' version '3.1.0' } dependencies { diff --git a/plugins/compiler/ramc-ram/build.gradle b/plugins/compiler/ramc-ram/build.gradle index 87a0ec9ff..a3d3ac02f 100644 --- a/plugins/compiler/ramc-ram/build.gradle +++ b/plugins/compiler/ramc-ram/build.gradle @@ -23,6 +23,7 @@ plugins { id 'java' id 'org.xbib.gradle.plugin.jflex' version "1.5.0" id "com.github.andrescv.jcup" version "1.0" + id 'com.adarshr.test-logger' version '3.1.0' } dependencies { diff --git a/plugins/compiler/raspc-rasp/build.gradle b/plugins/compiler/raspc-rasp/build.gradle index 8809ace16..a204aace1 100644 --- a/plugins/compiler/raspc-rasp/build.gradle +++ b/plugins/compiler/raspc-rasp/build.gradle @@ -23,6 +23,7 @@ plugins { id 'java' id 'org.xbib.gradle.plugin.jflex' version "1.5.0" id "com.github.andrescv.jcup" version "1.0" + id 'com.adarshr.test-logger' version '3.1.0' } dependencies { diff --git a/plugins/cpu/brainduck-cpu/build.gradle b/plugins/cpu/brainduck-cpu/build.gradle index a56d2ab9c..521f6e8ae 100644 --- a/plugins/cpu/brainduck-cpu/build.gradle +++ b/plugins/cpu/brainduck-cpu/build.gradle @@ -22,6 +22,7 @@ import org.apache.tools.ant.filters.ReplaceTokens plugins { id 'java' id 'net.emustudio.edigen-plugin' version '1.4.0' + id 'com.adarshr.test-logger' version '3.1.0' } repositories { diff --git a/plugins/cpu/ram-cpu/build.gradle b/plugins/cpu/ram-cpu/build.gradle index bbb9631b1..4369bff65 100644 --- a/plugins/cpu/ram-cpu/build.gradle +++ b/plugins/cpu/ram-cpu/build.gradle @@ -21,11 +21,12 @@ import org.apache.tools.ant.filters.ReplaceTokens plugins { id 'java' + id 'com.adarshr.test-logger' version '3.1.0' } repositories { + mavenLocal() mavenCentral() - jcenter() } dependencies { diff --git a/plugins/cpu/rasp-cpu/build.gradle b/plugins/cpu/rasp-cpu/build.gradle index 7c3144749..cd6827a5e 100644 --- a/plugins/cpu/rasp-cpu/build.gradle +++ b/plugins/cpu/rasp-cpu/build.gradle @@ -21,11 +21,12 @@ import org.apache.tools.ant.filters.ReplaceTokens plugins { id 'java' + id 'com.adarshr.test-logger' version '3.1.0' } repositories { + mavenLocal() mavenCentral() - jcenter() } dependencies { diff --git a/plugins/cpu/ssem-cpu/build.gradle b/plugins/cpu/ssem-cpu/build.gradle index bda6c24ed..be6d3ac3a 100644 --- a/plugins/cpu/ssem-cpu/build.gradle +++ b/plugins/cpu/ssem-cpu/build.gradle @@ -29,6 +29,7 @@ buildscript { plugins { id 'java' id 'net.emustudio.edigen-plugin' version '1.4.0' + id 'com.adarshr.test-logger' version '3.1.0' } repositories { diff --git a/plugins/device/88-dcdd/build.gradle b/plugins/device/88-dcdd/build.gradle index f7e60c2e4..6c9604c48 100644 --- a/plugins/device/88-dcdd/build.gradle +++ b/plugins/device/88-dcdd/build.gradle @@ -21,6 +21,7 @@ import org.apache.tools.ant.filters.ReplaceTokens plugins { id 'java' + id 'com.adarshr.test-logger' version '3.1.0' } dependencies { diff --git a/plugins/device/88-sio/build.gradle b/plugins/device/88-sio/build.gradle index 8447b444b..68c8d5766 100644 --- a/plugins/device/88-sio/build.gradle +++ b/plugins/device/88-sio/build.gradle @@ -21,6 +21,7 @@ import org.apache.tools.ant.filters.ReplaceTokens plugins { id 'java' + id 'com.adarshr.test-logger' version '3.1.0' } dependencies { diff --git a/plugins/device/abstract-tape/build.gradle b/plugins/device/abstract-tape/build.gradle index 1ecee54f5..0b8a975ae 100644 --- a/plugins/device/abstract-tape/build.gradle +++ b/plugins/device/abstract-tape/build.gradle @@ -21,6 +21,7 @@ import org.apache.tools.ant.filters.ReplaceTokens plugins { id 'java' + id 'com.adarshr.test-logger' version '3.1.0' } dependencies { diff --git a/plugins/device/adm3A-terminal/build.gradle b/plugins/device/adm3A-terminal/build.gradle index 4927ca8da..434a71698 100644 --- a/plugins/device/adm3A-terminal/build.gradle +++ b/plugins/device/adm3A-terminal/build.gradle @@ -21,6 +21,7 @@ import org.apache.tools.ant.filters.ReplaceTokens plugins { id 'java' + id 'com.adarshr.test-logger' version '3.1.0' } dependencies { diff --git a/plugins/device/brainduck-terminal/build.gradle b/plugins/device/brainduck-terminal/build.gradle index ca2ec8cee..001685704 100644 --- a/plugins/device/brainduck-terminal/build.gradle +++ b/plugins/device/brainduck-terminal/build.gradle @@ -21,6 +21,7 @@ import org.apache.tools.ant.filters.ReplaceTokens plugins { id 'java' + id 'com.adarshr.test-logger' version '3.1.0' } dependencies { diff --git a/plugins/device/simhPseudo-z80/build.gradle b/plugins/device/simhPseudo-z80/build.gradle index 3f6bdf949..8ae21bce6 100644 --- a/plugins/device/simhPseudo-z80/build.gradle +++ b/plugins/device/simhPseudo-z80/build.gradle @@ -21,6 +21,7 @@ import org.apache.tools.ant.filters.ReplaceTokens plugins { id 'java' + id 'com.adarshr.test-logger' version '3.1.0' } dependencies { diff --git a/plugins/device/ssem-display/build.gradle b/plugins/device/ssem-display/build.gradle index 31bcd9301..58586f2c0 100644 --- a/plugins/device/ssem-display/build.gradle +++ b/plugins/device/ssem-display/build.gradle @@ -21,6 +21,7 @@ import org.apache.tools.ant.filters.ReplaceTokens plugins { id 'java' + id 'com.adarshr.test-logger' version '3.1.0' } dependencies { diff --git a/plugins/memory/brainduck-mem/build.gradle b/plugins/memory/brainduck-mem/build.gradle index 1ecee54f5..0b8a975ae 100644 --- a/plugins/memory/brainduck-mem/build.gradle +++ b/plugins/memory/brainduck-mem/build.gradle @@ -21,6 +21,7 @@ import org.apache.tools.ant.filters.ReplaceTokens plugins { id 'java' + id 'com.adarshr.test-logger' version '3.1.0' } dependencies { diff --git a/plugins/memory/byte-mem/build.gradle b/plugins/memory/byte-mem/build.gradle index 1ecee54f5..0b8a975ae 100644 --- a/plugins/memory/byte-mem/build.gradle +++ b/plugins/memory/byte-mem/build.gradle @@ -21,6 +21,7 @@ import org.apache.tools.ant.filters.ReplaceTokens plugins { id 'java' + id 'com.adarshr.test-logger' version '3.1.0' } dependencies { diff --git a/plugins/memory/ram-mem/build.gradle b/plugins/memory/ram-mem/build.gradle index 1ecee54f5..0b8a975ae 100644 --- a/plugins/memory/ram-mem/build.gradle +++ b/plugins/memory/ram-mem/build.gradle @@ -21,6 +21,7 @@ import org.apache.tools.ant.filters.ReplaceTokens plugins { id 'java' + id 'com.adarshr.test-logger' version '3.1.0' } dependencies { diff --git a/plugins/memory/rasp-mem/build.gradle b/plugins/memory/rasp-mem/build.gradle index 6e73daf6e..c520933d4 100644 --- a/plugins/memory/rasp-mem/build.gradle +++ b/plugins/memory/rasp-mem/build.gradle @@ -21,6 +21,7 @@ import org.apache.tools.ant.filters.ReplaceTokens plugins { id 'java' + id 'com.adarshr.test-logger' version '3.1.0' } dependencies { diff --git a/plugins/memory/ssem-mem/build.gradle b/plugins/memory/ssem-mem/build.gradle index 9449fd043..adf3d05a5 100644 --- a/plugins/memory/ssem-mem/build.gradle +++ b/plugins/memory/ssem-mem/build.gradle @@ -21,6 +21,7 @@ import org.apache.tools.ant.filters.ReplaceTokens plugins { id 'java' + id 'com.adarshr.test-logger' version '3.1.0' } dependencies {