Diagnostics and semantic errors
Learning objective
- Interpret diagnostics quickly and choose the right fix path.
Key syntax
Line 2, column 12: Incompatible return type: expected int but got string
Examples
- Common diagnostics:
- undeclared variable
- unknown function or class
- wrong argument count
- incompatible assignment or return type
- return outside function
- cyclic import or missing symbol
Frequent diagnostics and quick fixes
Undeclared variable: 'x'
- Cause: variable not declared in current scope. - Fix: declare with let/const or reference the correct symbol.
Unknown function or class: 'Foo'
- Cause: missing import, typo, or wrong symbol name. - Fix: add import and verify exact identifier.
Incorrect number of arguments for 'fn': A != B
- Cause: call does not match function/method signature. - Fix: update call arguments or signature.
Cannot initialize 'x' of type list<T> with list<any>
- Cause: incompatible inferred list type. - Fix: use a typed declaration (let x: list<T> = []) or compatible values.
Cannot call member 'length' on type list<...>
- Cause: length() is not a Lucia list method. - Fix: use len(listValue).
Unexpected Token '='near indexed write
- Cause in older compiler versions: indexed assignment target not enabled. - Current behavior: obj[i] = value; is supported.
Common mistakes
- Applying quick fix without understanding root cause.
- Ignoring file/module boundaries when errors come from imports.
Debug workflow
- Read the first error first. Later diagnostics are often cascade effects.
- Verify imports and symbol names before touching complex logic.
- Reduce to a minimal reproducible snippet.
- Re-run after each fix to confirm the true root cause is solved.
Suggested practice
- Trigger 3 diagnostics intentionally and fix each with explanation.
Related
- declarations-let-const
- functions-and-builtins
- oop-and-modules