Skip to content

Commit a154a94

Browse files
committed
feat: Add linting for parameter objects
1 parent 11cb38f commit a154a94

File tree

2 files changed

+29
-7
lines changed

2 files changed

+29
-7
lines changed

app/assets/stylesheets/elements/_codemirror.scss

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,11 @@
174174
background: transparent;
175175
}
176176

177+
.cm-lintRange-warning {
178+
box-shadow: 0 3px 0 $orange;
179+
background: transparent;
180+
}
181+
177182
.cm-lint-marker-error::before {
178183
content: "!";
179184
display: block;

app/javascript/src/lib/OWLanguageLinter.js

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { getClosingBracket, getPhraseFromPosition, splitArgumentsString } from "../utils/parse"
22
import { completionsMap, subroutinesMap, workshopConstants } from "../stores/editor"
33
import { get } from "svelte/store"
4+
import { getFirstParameterObject } from "../utils/compiler/parameterObjects"
45

56
let diagnostics = []
67

@@ -103,6 +104,7 @@ function findIncorrectArgsLength(content) {
103104
if (item.label != name) continue
104105

105106
let message = ""
107+
let severity = "error"
106108

107109
if (item.args_unlimited) continue
108110

@@ -126,22 +128,37 @@ function findIncorrectArgsLength(content) {
126128

127129
const splitContent = splitArgumentsString(argumentsString)
128130

129-
if (item.args_min_length && splitContent.length >= item.args_min_length && splitContent.length <= item.args_length) break
130-
if (!item.args_min_length && splitContent.length == item.args_length) break
131+
// Arguments string is a parameter object
132+
if (argumentsString.trim()[0] === "{") {
133+
const parameterObject = getFirstParameterObject(content.slice(match.index, closing + 1))
131134

132-
const expectedString = `${ item.args_min_length ? "Atleast" : "" } ${ item.args_min_length || item.args_length }`
133-
const maxString = `${ item.args_min_length ? ` (${ item.args_length } max)` : "" }`
134-
const givenString = `${ splitContent.length } given`
135+
if (!parameterObject) break
136+
137+
const invalidArgument = Object.keys(parameterObject.given).filter(i => i && !parameterObject.phraseParameters.includes(i))
138+
if (invalidArgument?.length) {
139+
message = `Argument(s) "${ invalidArgument.join(", ") }" are not valid for "${ name }"`
140+
severity = "warning"
141+
} else break
142+
} else {
143+
// Argument string is a regular list of arguments
144+
if (item.args_min_length && splitContent.length >= item.args_min_length && splitContent.length <= item.args_length) break
145+
if (!item.args_min_length && splitContent.length == item.args_length) break
146+
147+
const expectedString = `${ item.args_min_length ? "Atleast" : "" } ${ item.args_min_length || item.args_length }`
148+
const maxString = `${ item.args_min_length ? ` (${ item.args_length } max)` : "" }`
149+
const givenString = `${ splitContent.length } given`
150+
151+
message = `${ expectedString } Argument(s) expected${ maxString }, ${ givenString }`
152+
}
135153

136-
message = `${ expectedString } Argument(s) expected${ maxString }, ${ givenString }`
137154
}
138155

139156
if (!message) break
140157

141158
diagnostics.push({
142159
from: match.index + match.match.length - name.length,
143160
to: match.index + match.match.length,
144-
severity: "error",
161+
severity,
145162
message: message
146163
})
147164

0 commit comments

Comments
 (0)