tweak in error output for file links, corrected column number off-by-one

This commit is contained in:
Irmen de Jong 2021-12-04 16:46:26 +01:00
parent 20401b99d8
commit ce3c34e458
12 changed files with 48 additions and 31 deletions

View File

@ -0,0 +1,10 @@
<component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173">
<JetCodeStyleSettings>
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
</JetCodeStyleSettings>
<codeStyleSettings language="kotlin">
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
</codeStyleSettings>
</code_scheme>
</component>

View File

@ -0,0 +1,5 @@
<component name="ProjectCodeStyleConfiguration">
<state>
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
</state>
</component>

View File

@ -19,7 +19,7 @@
<component name="FrameworkDetectionExcludesConfiguration"> <component name="FrameworkDetectionExcludesConfiguration">
<type id="Python" /> <type id="Python" />
</component> </component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_11" project-jdk-name="Kotlin SDK" project-jdk-type="KotlinSDK"> <component name="ProjectRootManager" version="2" languageLevel="JDK_11" project-jdk-name="11" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" /> <output url="file://$PROJECT_DIR$/out" />
</component> </component>
</project> </project>

View File

@ -32,7 +32,7 @@ internal class ErrorReporter: IErrorReporter {
MessageSeverity.ERROR -> printer.print("\u001b[91m") // bright red MessageSeverity.ERROR -> printer.print("\u001b[91m") // bright red
MessageSeverity.WARNING -> printer.print("\u001b[93m") // bright yellow MessageSeverity.WARNING -> printer.print("\u001b[93m") // bright yellow
} }
val msg = "${it.position.toClickableStr()} ${it.severity} ${it.message}".trim() val msg = "${it.severity} ${it.position.toClickableStr()} ${it.message}".trim()
if(msg !in alreadyReportedMessages) { if(msg !in alreadyReportedMessages) {
printer.println(msg) printer.println(msg)
alreadyReportedMessages.add(msg) alreadyReportedMessages.add(msg)

View File

@ -209,14 +209,14 @@ class TestModuleImporter: FunSpec({
val result = importer.importLibraryModule(filenameNoExt) val result = importer.importLibraryModule(filenameNoExt)
withClue(count[n] + " call / NO .p8 extension") { result shouldBe null } withClue(count[n] + " call / NO .p8 extension") { result shouldBe null }
withClue(count[n] + " call / NO .p8 extension") { errors.noErrors() shouldBe false } withClue(count[n] + " call / NO .p8 extension") { errors.noErrors() shouldBe false }
errors.errors.single() shouldContain "0:0: no module found with name i_do_not_exist" errors.errors.single() shouldContain "0:0) no module found with name i_do_not_exist"
errors.report() errors.report()
program.modules.size shouldBe 1 program.modules.size shouldBe 1
val result2 = importer.importLibraryModule(filenameWithExt) val result2 = importer.importLibraryModule(filenameWithExt)
withClue(count[n] + " call / with .p8 extension") { result2 shouldBe null } withClue(count[n] + " call / with .p8 extension") { result2 shouldBe null }
withClue(count[n] + " call / with .p8 extension") { importer.errors.noErrors() shouldBe false } withClue(count[n] + " call / with .p8 extension") { importer.errors.noErrors() shouldBe false }
errors.errors.single() shouldContain "0:0: no module found with name i_do_not_exist.p8" errors.errors.single() shouldContain "0:0) no module found with name i_do_not_exist.p8"
errors.report() errors.report()
program.modules.size shouldBe 1 program.modules.size shouldBe 1
} }

View File

@ -229,8 +229,8 @@ class TestCompilerOnRanges: FunSpec({
} }
""", errors, false).assertFailure() """, errors, false).assertFailure()
errors.errors.size shouldBe 2 errors.errors.size shouldBe 2
errors.errors[0] shouldContain ".p8:5:29: range expression from value must be integer" errors.errors[0] shouldContain ".p8:5:30) range expression from value must be integer"
errors.errors[1] shouldContain ".p8:5:44: range expression to value must be integer" errors.errors[1] shouldContain ".p8:5:45) range expression to value must be integer"
} }
test("testForLoopWithIterable_str") { test("testForLoopWithIterable_str") {

View File

@ -148,7 +148,7 @@ class TestSubroutines: FunSpec({
val errors = ErrorReporterForTests() val errors = ErrorReporterForTests()
compileText(C64Target, false, text, errors, false).assertFailure("currently array dt in signature is invalid") // TODO should not be invalid? compileText(C64Target, false, text, errors, false).assertFailure("currently array dt in signature is invalid") // TODO should not be invalid?
errors.warnings.size shouldBe 0 errors.warnings.size shouldBe 0
errors.errors.single() shouldContain ".p8:9:16: Non-string pass-by-reference types cannot occur as a parameter type directly" errors.errors.single() shouldContain ".p8:9:17) Non-string pass-by-reference types cannot occur as a parameter type directly"
} }
// TODO allow this? // TODO allow this?
@ -281,8 +281,8 @@ class TestSubroutines: FunSpec({
val errors = ErrorReporterForTests() val errors = ErrorReporterForTests()
compileText(C64Target, false, text, writeAssembly = false, errors=errors).assertFailure() compileText(C64Target, false, text, writeAssembly = false, errors=errors).assertFailure()
errors.errors.size shouldBe 2 errors.errors.size shouldBe 2
errors.errors[0] shouldContain "7:24: invalid number of arguments" errors.errors[0] shouldContain "7:25) invalid number of arguments"
errors.errors[1] shouldContain "9:24: invalid number of arguments" errors.errors[1] shouldContain "9:25) invalid number of arguments"
} }
test("invalid number of args check on asm subroutine") { test("invalid number of args check on asm subroutine") {
@ -302,8 +302,8 @@ class TestSubroutines: FunSpec({
val errors = ErrorReporterForTests() val errors = ErrorReporterForTests()
compileText(C64Target, false, text, writeAssembly = false, errors=errors).assertFailure() compileText(C64Target, false, text, writeAssembly = false, errors=errors).assertFailure()
errors.errors.size shouldBe 2 errors.errors.size shouldBe 2
errors.errors[0] shouldContain "7:24: invalid number of arguments" errors.errors[0] shouldContain "7:25) invalid number of arguments"
errors.errors[1] shouldContain "9:24: invalid number of arguments" errors.errors[1] shouldContain "9:25) invalid number of arguments"
} }
test("invalid number of args check on call to label and builtin func") { test("invalid number of args check on call to label and builtin func") {

View File

@ -29,7 +29,7 @@ private fun ParserRuleContext.toPosition() : Position {
pathString pathString
} }
// note: beware of TAB characters in the source text, they count as 1 column... // note: beware of TAB characters in the source text, they count as 1 column...
return Position(filename, start.line, start.charPositionInLine, start.charPositionInLine + start.stopIndex - start.startIndex) return Position(filename, start.line, start.charPositionInLine+1, start.charPositionInLine + 1 + start.stopIndex - start.startIndex)
} }
internal fun Prog8ANTLRParser.BlockContext.toAst(isInLibrary: Boolean) : Block { internal fun Prog8ANTLRParser.BlockContext.toAst(isInLibrary: Boolean) : Block {

View File

@ -1,6 +1,8 @@
package prog8.ast.base package prog8.ast.base
import prog8.ast.Node import prog8.ast.Node
import kotlin.io.path.Path
import kotlin.io.path.absolute
/**************************** AST Data classes ****************************/ /**************************** AST Data classes ****************************/
@ -187,7 +189,7 @@ object ParentSentinel : Node {
data class Position(val file: String, val line: Int, val startCol: Int, val endCol: Int) { data class Position(val file: String, val line: Int, val startCol: Int, val endCol: Int) {
override fun toString(): String = "[$file: line $line col ${startCol+1}-${endCol+1}]" override fun toString(): String = "[$file: line $line col ${startCol+1}-${endCol+1}]"
fun toClickableStr(): String = "$file:$line:$startCol:" fun toClickableStr(): String = "(${Path("").absolute()}/$file:$line:$startCol)"
companion object { companion object {
val DUMMY = Position("<dummy>", 0, 0, 0) val DUMMY = Position("<dummy>", 0, 0, 0)

View File

@ -296,9 +296,9 @@ class TestProg8Parser: FunSpec( {
val mpf = module.position.file val mpf = module.position.file
assertPositionOf(module, SourceCode.relative(path).toString(), 1, 0) assertPositionOf(module, SourceCode.relative(path).toString(), 1, 0)
val mainBlock = module.statements.filterIsInstance<Block>()[0] val mainBlock = module.statements.filterIsInstance<Block>()[0]
assertPositionOf(mainBlock, mpf, 2, 0, 3) assertPositionOf(mainBlock, mpf, 2, 1, 4)
val startSub = mainBlock.statements.filterIsInstance<Subroutine>()[0] val startSub = mainBlock.statements.filterIsInstance<Subroutine>()[0]
assertPositionOf(startSub, mpf, 3, 4, 6) assertPositionOf(startSub, mpf, 3, 5, 7)
} }
test("of non-root Nodes parsed from a string") { test("of non-root Nodes parsed from a string") {
@ -320,22 +320,22 @@ class TestProg8Parser: FunSpec( {
val mpf = module.position.file val mpf = module.position.file
val targetDirective = module.statements.filterIsInstance<Directive>()[0] val targetDirective = module.statements.filterIsInstance<Directive>()[0]
assertPositionOf(targetDirective, mpf, 1, 0, 8) assertPositionOf(targetDirective, mpf, 1, 1, 9)
val mainBlock = module.statements.filterIsInstance<Block>()[0] val mainBlock = module.statements.filterIsInstance<Block>()[0]
assertPositionOf(mainBlock, mpf, 2, 0, 3) assertPositionOf(mainBlock, mpf, 2, 1, 4)
val startSub = mainBlock.statements.filterIsInstance<Subroutine>()[0] val startSub = mainBlock.statements.filterIsInstance<Subroutine>()[0]
assertPositionOf(startSub, mpf, 3, 4, 6) assertPositionOf(startSub, mpf, 3, 5, 7)
val declFoo = startSub.statements.filterIsInstance<VarDecl>()[0] val declFoo = startSub.statements.filterIsInstance<VarDecl>()[0]
assertPositionOf(declFoo, mpf, 4, 8, 12) assertPositionOf(declFoo, mpf, 4, 9, 13)
val rhsFoo = declFoo.value!! val rhsFoo = declFoo.value!!
assertPositionOf(rhsFoo, mpf, 4, 20, 21) assertPositionOf(rhsFoo, mpf, 4, 21, 22)
val declBar = startSub.statements.filterIsInstance<VarDecl>()[1] val declBar = startSub.statements.filterIsInstance<VarDecl>()[1]
assertPositionOf(declBar, mpf, 5, 8, 12) assertPositionOf(declBar, mpf, 5, 9, 13)
val whenStmt = startSub.statements.filterIsInstance<WhenStatement>()[0] val whenStmt = startSub.statements.filterIsInstance<WhenStatement>()[0]
assertPositionOf(whenStmt, mpf, 6, 8, 11) assertPositionOf(whenStmt, mpf, 6, 9, 12)
assertPositionOf(whenStmt.choices[0], mpf, 7, 12, 13) assertPositionOf(whenStmt.choices[0], mpf, 7, 13, 14)
assertPositionOf(whenStmt.choices[1], mpf, 8, 12, 13) assertPositionOf(whenStmt.choices[1], mpf, 8, 13, 14)
assertPositionOf(whenStmt.choices[2], mpf, 9, 12, 15) assertPositionOf(whenStmt.choices[2], mpf, 9, 13, 16)
} }
} }

View File

@ -5,7 +5,7 @@
<content url="file://$MODULE_DIR$"> <content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/build" /> <excludeFolder url="file://$MODULE_DIR$/build" />
</content> </content>
<orderEntry type="jdk" jdkName="Python 3.9" jdkType="Python SDK" /> <orderEntry type="jdk" jdkName="Python 3.9 (py3)" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" /> <orderEntry type="sourceFolder" forTests="false" />
</component> </component>
</module> </module>

View File

@ -1,11 +1,11 @@
Prog8 syntax highlighting file for IntelliJ IDEA. Prog8 syntax highlighting file for IntelliJ IDEA.
Copy the file Prog8.xml to your IDEA filetypes folder. Copy the file Prog8.xml to your IDEA filetypes folder.
If this folder doesn't yet exist, simply create it.
After installing this file, restart the IDEA.
The exact path may vary with the version of the IDE, The exact location of the folder varies per operating system and
but for me it is currently this on Linux: IDE version, but for me it is currently this on Linux:
$HOME/.config/JetBrains/IntelliJIdea2020.2/filetypes/ $HOME/.config/JetBrains/IntelliJIdea2021.3/filetypes/
(note the version number in the path, adjust accordingly)