Skip to content

Latest commit

 

History

History
382 lines (304 loc) · 10.3 KB

README.md

File metadata and controls

382 lines (304 loc) · 10.3 KB

Rules

Documentation for all diagnostics sent back to the client.

Warnings

Error message: Unused name

Flags variables that are declared but not used within the code.

const pi = 3.14;
display(5*5*3.14);

The variable pi should have a warning.

Errors

Error message: Missing semicolon

Identifies statements that are missing semicolons.

const x = 1

The line ending should have an error.

Error message: Trailing comma

Identifies expressions that have trailing commas.

const x = [1,2,3,];

The comma after 3 should have an error.

Error message: Only normal imports are allowed

Bans namespace and default imports.

import * as rune from "rune";
import black from "rune";

Both lines will throw an error around the identifier.

Error message: Unexpected token

Only allows identifiers as function parameters

function foo(a+b) {}

a+b will throw an error.

Error message: Identifier '${name}' has already been declared

Bans redeclaration of names in the same scope

let x = 1;
let x = 2;

The second x will throw an error.

Error message: Array expressions are not allowed

Bans array expressions before Source 3

const x = [1,2,3];

The array [1,2,3]; will throw an error.

Error message: No holes are allowed in array literals

Bans empty elements in array expressions

[1,,3];

The array [1,,3] will throw an error.

Error message: Cannot assign new value to constant ${name}

Bans reassignment to constant variable

const x = 1;
x = 2;

The second x will throw an error

Error message: Incomplete binary expression

Detects when a binary expression is missing a left/right node

10 + ;
5 === ;

Both lines will throw an error

Error message: Use ===/!== instead of ==/!=

Bans the use of loose equality checks == and !=

true == 1;

Error message: ${operator} is not allowed

Only permitted operators defined in Source is allowed. Binary operators like ^ or instanceof is banned, unary operators like typeof is also banned.

100^5;
typeof 1 === "number";

The two expressions will throw an error.

Error message: Expected string or number on left/right hand side of operation, got ${type}

Before Source 3, only strings or numbers can be in equality checks

true === 1; // Expected string or number on left hand side of operation, got boolean
true === (1 === 1); // Expected string or number on left hand side of operation, got boolean
(1 === 1) === undefined; // Expected string or number on right hand side of operation, got undefined
"string" === 1; // Expected string on left hand side of operation, got number

Errors are shown in the comments.

Error message: Break statements are not allowed;

No break statements before Source 3

break;

break will throw an error.

Error message: ${name} is not a function

Cannot call identifiers that are not a function

const x = 1;
x();
let y = 1;
y();

The function application on x will throw an error, however the function application on y will not, as y can be reassigned, hence it will be a runtime error.

Error message: Expected ${num_args} or more arguments, but got ${num_supplied_args}

Detects when a function application has not enough parameters. Currently does not work for anonymous lambdas.

display();

The call to display needs at least 1 element.

Error message: Incomplete ternary

Detects when a ternary does not have a consequent or alternate case.

b => b ? 1;

b ? 1 throws an error, as there is no alternate case.

Error message: Continue statements are not allowed

Bans continue statements before Source 3

continue;

continue will throw an error.

Error message: For statements are not allowed

Bans for statements before Source 3

for(let i = 0; i < 10; i++) {}

for(...) will throw an error.

Error message: Missing curly braces around for/while/if/else

Detects missing curly braces for some statements

if (1 === 1)
  display("1 is equal to 1");

The whole expression will throw an error.

Error message: Incomplete for loop

Detects if a for loop is missing any parts

for (let i = 0; i < 10;) {
}

for(...) will throw an error.

Error message: Missing function name

Detects if function declaration is incomplete

function () {}

The whole expression will throw an error.

Error message: No params allowed after rest element

If a function has a rest parameter, it must be the last parameter.

function foo(arg1, ...arg2, arg3) {}
(arg1, ...arg2, arg3) => {};

Both cases will throw an error around arg3

Error message: Name ${name} not declared

Detects if there is a declaration for an identifier in its scope.

{
  const x = 1;
  {
    display(x);
  }
}
display(x);

The first x in display(x) should not throw an error, but the second one should.

Error message: Missing "else" in "if-else" statement

else case is required in an if statement before Source 3

if (true) {
  display("hello world");
}

An error will be thrown around the body of the if statement.

Error message: Expected module name

Imports require the module name.

import { black }

An error will be thrown around the whole import statement.

Error message: Incomplete string expression

Strings must be closed within the same line

"hello world
";

An error will be thrown on both lines.

Error message: Null literals are not allowed

Nulls are not allowed in Source 1.

display(null);

An error will be thrown around null.

Error message: Member access expressions are not allowed

Member access with square brackets [] is not allowed before source 3.

"hello world"[0];

An error will be thrown around the whole expression.

Error message: No dot abbreviations

Source prohibits usage of dot access in any case.

display("hello world".length);

An error will be thrown around the whole expression.

Error message: Expected integer as array index, got ${type}

Array access must use non negative integers

const arr = [1,2,3];
arr[undefined]; // Expected non negative integer as array index, got undefined.
arr["test"]; // Expected non negative integer as array index, got string.
arr[1.1]; // Expected non negative integer as array index, got float.
arr[-1]; // Expected non negative integer as array index, got negative number.

Errors are shown in the comments.

Error message: Missing value in return statement

Returns statements must return a value in Source.

function foo() {
  return;
}

An error will be thrown around the return statement.

Error message: Spread syntax is only allowed when supplying arguments to a function

The spread syntax ... can only be used directly inside a function call as a parameter.

const x = [1,2,3];
display(list(...x)); // Valid
display(list((...x)); // Not valid

The second use of the spread syntax will throw an error.

Error message: Expressions not allowed in template literal

In Source, template literals are only used for multiline string, they cannot contain expressions.

const x = `10 * 10 = ${10*10}`

The expression 10*10 will throw an error.

Error message: Multiple declarations not allowed

In Source, only 1 declaration is allowed in each variable declarator.

const x = 1, y = 2, z = 3;

The whole statement will throw an error.

Error message: Incomplete variable declaration

Detects whether left and right side of variable declaration in present;

const x;

The whole statement will throw an error.

Error message: Use keyword "const" instead to declare a constant

Before Source 3, variables can only be declared with const

let x = 1;

The whole statement will throw an error.

Error message: While statements are not allowed

Before Source 3, while statements are not allowed.

while(true) {
  display("hi")
}

while(...) will throw an error.