mirror of
https://github.com/Noratrieb/riverdelta.git
synced 2026-01-14 16:35:03 +01:00
fmt
This commit is contained in:
parent
bf9fbcc069
commit
7ca78530a1
4 changed files with 58 additions and 36 deletions
|
|
@ -10,7 +10,7 @@ A Riverdelta program consists of many items, like functions. Every item ends wit
|
|||
semicolon.
|
||||
|
||||
```js
|
||||
item = item_function | item_type | item_import | item_extern | item_mod
|
||||
item = item_function | item_type | item_import | item_extern | item_mod;
|
||||
```
|
||||
|
||||
### Functions
|
||||
|
|
@ -25,6 +25,7 @@ item_function := "function" function_sig "=" expr ";"
|
|||
```js
|
||||
function helloWorld() = ;
|
||||
```
|
||||
|
||||
```js
|
||||
function block() = (
|
||||
1;
|
||||
|
|
@ -136,7 +137,6 @@ the module statement.
|
|||
`.nil` files cannot declare file submodules but only inline modules.
|
||||
If the current file is `a/a.mod.nil`, then `mod foo;` will look for `a/b.nil` or `a/b/b.mod.nil`.
|
||||
|
||||
|
||||
### Globals
|
||||
|
||||
Globals are mutable values.
|
||||
|
|
@ -153,4 +153,4 @@ They can be accessed like local variables. Their initial value must be literal e
|
|||
|
||||
## Expressions
|
||||
|
||||
there are many expressions and im not going to list a single one.
|
||||
there are many expressions and im not going to list a single one.
|
||||
|
|
|
|||
|
|
@ -133,7 +133,7 @@ function resolveModule(
|
|||
|
||||
for (let i = tyParamScopes.length - 1; i >= 0; i--) {
|
||||
const candidate = tyParamScopes[i];
|
||||
|
||||
|
||||
if (candidate === ident.name) {
|
||||
return {
|
||||
kind: "tyParam",
|
||||
|
|
@ -228,7 +228,7 @@ function resolveModule(
|
|||
};
|
||||
}
|
||||
case "type": {
|
||||
tyParamScopes = item.generics.map(({name}) => name);
|
||||
tyParamScopes = item.generics.map(({ name }) => name);
|
||||
|
||||
const type = { ...superFoldItem(item, this) };
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import {
|
||||
BuiltinName,
|
||||
BuiltinName,
|
||||
COMPARISON_KINDS,
|
||||
Crate,
|
||||
EQUALITY_KINDS,
|
||||
|
|
@ -29,7 +29,15 @@ import {
|
|||
import { CompilerError, ErrorEmitted, Span, unreachable } from "../error";
|
||||
import { printTy } from "../printer";
|
||||
import { InferContext } from "./infer";
|
||||
import { TypeckCtx, emitError, lowerAstTy, mkTyFn, tyError, tyErrorFrom, typeOfItem } from "./item";
|
||||
import {
|
||||
TypeckCtx,
|
||||
emitError,
|
||||
lowerAstTy,
|
||||
mkTyFn,
|
||||
tyError,
|
||||
tyErrorFrom,
|
||||
typeOfItem,
|
||||
} from "./item";
|
||||
|
||||
export function exprError(err: ErrorEmitted, span: Span): Expr<Typecked> {
|
||||
return {
|
||||
|
|
@ -41,36 +49,35 @@ export function exprError(err: ErrorEmitted, span: Span): Expr<Typecked> {
|
|||
}
|
||||
|
||||
type FuncCtx = {
|
||||
cx: TypeckCtx;
|
||||
infcx: InferContext;
|
||||
localTys: Ty[];
|
||||
loopState: LoopState[];
|
||||
checkExpr: (expr: Expr<Resolved>) => Expr<Typecked>;
|
||||
};
|
||||
|
||||
type LoopState = { hasBreak: boolean; loopId: LoopId };
|
||||
|
||||
function typeOfValue(fcx: FuncCtx, res: Resolution, span: Span): Ty {
|
||||
switch (res.kind) {
|
||||
case "local": {
|
||||
const idx = fcx.localTys.length - 1 - res.index;
|
||||
return fcx.localTys[idx];
|
||||
}
|
||||
case "item": {
|
||||
return typeOfItem(fcx.cx, res.id, [], span);
|
||||
}
|
||||
case "builtin":
|
||||
return typeOfBuiltinValue(fcx, res.name, span);
|
||||
case "tyParam":
|
||||
return tyError(
|
||||
fcx.cx,
|
||||
new CompilerError(`type parameter cannot be used as value`, span),
|
||||
);
|
||||
case "error":
|
||||
return tyErrorFrom(res);
|
||||
cx: TypeckCtx;
|
||||
infcx: InferContext;
|
||||
localTys: Ty[];
|
||||
loopState: LoopState[];
|
||||
checkExpr: (expr: Expr<Resolved>) => Expr<Typecked>;
|
||||
};
|
||||
|
||||
type LoopState = { hasBreak: boolean; loopId: LoopId };
|
||||
|
||||
function typeOfValue(fcx: FuncCtx, res: Resolution, span: Span): Ty {
|
||||
switch (res.kind) {
|
||||
case "local": {
|
||||
const idx = fcx.localTys.length - 1 - res.index;
|
||||
return fcx.localTys[idx];
|
||||
}
|
||||
case "item": {
|
||||
return typeOfItem(fcx.cx, res.id, [], span);
|
||||
}
|
||||
case "builtin":
|
||||
return typeOfBuiltinValue(fcx, res.name, span);
|
||||
case "tyParam":
|
||||
return tyError(
|
||||
fcx.cx,
|
||||
new CompilerError(`type parameter cannot be used as value`, span),
|
||||
);
|
||||
case "error":
|
||||
return tyErrorFrom(res);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
export function typeOfBuiltinValue(
|
||||
fcx: FuncCtx,
|
||||
|
|
|
|||
|
|
@ -1,4 +1,19 @@
|
|||
import { Crate, Expr, Folder, Item, ItemId, Resolved, TY_I32, TY_INT, Ty, TyFn, Typecked, foldAst, mkDefaultFolder, tyIsUnit } from "../ast";
|
||||
import {
|
||||
Crate,
|
||||
Expr,
|
||||
Folder,
|
||||
Item,
|
||||
ItemId,
|
||||
Resolved,
|
||||
TY_I32,
|
||||
TY_INT,
|
||||
Ty,
|
||||
TyFn,
|
||||
Typecked,
|
||||
foldAst,
|
||||
mkDefaultFolder,
|
||||
tyIsUnit,
|
||||
} from "../ast";
|
||||
import { GlobalContext } from "../context";
|
||||
import { CompilerError, ErrorEmitted, Span } from "../error";
|
||||
import { ComplexMap } from "../utils";
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue