Class: KipperTypeChecker
compiler.KipperTypeChecker
Kipper Type Checker, which asserts that type logic and cohesion is valid and throws errors in case that an invalid use of types and identifiers is detected.
Since
0.7.0
Hierarchy
-
↳
KipperTypeChecker
Table of contents
Constructors
Properties
Methods
- assertError
- checkMatchingTypes
- error
- getCheckedType
- getTypeOfMemberAccessExpression
- notImplementedError
- objectLikeIsIndexableOrAccessible
- refTargetCallable
- setTracebackData
- typeExists
- validArgumentValue
- validArithmeticExpression
- validAssignment
- validBitwiseExpression
- validBracketNotationKey
- validConditionalExpression
- validConversion
- validFunctionCallArguments
- validRelationalExpression
- validReturnCodePathsInFunctionBody
- validReturnStatement
- validSliceNotationKey
- validUnaryExpression
- validVariableDefinition
- getTypeForAnalysis
Constructors
constructor
• new KipperTypeChecker(programCtx
)
Parameters
Name | Type |
---|---|
programCtx |
KipperProgramContext |
Overrides
KipperSemanticsAsserter.constructor
Defined in
kipper/core/src/compiler/analysis/analyser/type-checker.ts:75
Properties
col
• Protected
col: undefined
| number
Inherited from
Defined in
kipper/core/src/compiler/analysis/analyser/err-handler/semantics-error-handler.ts:16
ctx
• Protected
ctx: undefined
| CompilableASTNode
<SemanticData
, TypeData
>
Inherited from
Defined in
kipper/core/src/compiler/analysis/analyser/err-handler/semantics-error-handler.ts:17
filePath
• Protected
filePath: undefined
| string
Inherited from
KipperSemanticsAsserter.filePath
Defined in
kipper/core/src/compiler/analysis/analyser/err-handler/semantics-error-handler.ts:18
line
• Protected
line: undefined
| number
Inherited from
Defined in
kipper/core/src/compiler/analysis/analyser/err-handler/semantics-error-handler.ts:15
programCtx
• Readonly
programCtx: KipperProgramContext
Inherited from
KipperSemanticsAsserter.programCtx
Defined in
kipper/core/src/compiler/analysis/analyser/err-handler/semantics-asserter.ts:19
stream
• Protected
stream: undefined
| KipperFileStream
Inherited from
KipperSemanticsAsserter.stream
Defined in
kipper/core/src/compiler/analysis/analyser/err-handler/semantics-error-handler.ts:19
Methods
assertError
▸ Protected
assertError(error
, overwriteCtx?
): KipperError
Updates the given error and adds the proper traceback data, and returns it.
Parameters
Name | Type | Description |
---|---|---|
error |
KipperError |
The error to update. |
overwriteCtx? |
CompilableASTNode <SemanticData , TypeData > |
The context to overwrite the current context with. This is used when a parent checks children semantics in order to provide the correct traceback data and errors occur in the children. |
Returns
The Kipper error.
Inherited from
KipperSemanticsAsserter.assertError
Defined in
kipper/core/src/compiler/analysis/analyser/err-handler/semantics-asserter.ts:34
checkMatchingTypes
▸ checkMatchingTypes(type1
, type2
): boolean
Checks whether the passed types are matching.
Since
0.10.0
Parameters
Name | Type | Description |
---|---|---|
type1 |
KipperCompilableType |
The first type that is given. |
type2 |
KipperCompilableType |
The second type that is given. |
Returns
boolean
True if the types are matching, otherwise false.
Defined in
kipper/core/src/compiler/analysis/analyser/type-checker.ts:146
error
▸ Protected
error(error
): KipperError
Updates the error and adds the proper traceback data, and returns it.
This function also automatically logs the error.
Parameters
Name | Type | Description |
---|---|---|
error |
KipperError |
The error to update. |
Returns
The Kipper error.
Inherited from
Defined in
kipper/core/src/compiler/analysis/analyser/err-handler/semantics-error-handler.ts:52
getCheckedType
▸ getCheckedType(type
): CheckedType
Creates a new CheckedType instance based on the passed KipperType.
If the type is invalid, the function will still return a CheckedType, but the field isCompilable will be false and the instance WILL NOT be usable for a compilation.
Parameters
Name | Type | Description |
---|---|---|
type |
UncheckedType |
The unchecked type to analyse. |
Returns
Defined in
kipper/core/src/compiler/analysis/analyser/type-checker.ts:113
getTypeOfMemberAccessExpression
▸ getTypeOfMemberAccessExpression(memberAccess
): CheckedType
Get the type that this member access expression is accessing.
Since
0.10.0
Parameters
Name | Type | Description |
---|---|---|
memberAccess |
MemberAccessExpression |
The member access expression to get the type for. |
Returns
Defined in
kipper/core/src/compiler/analysis/analyser/type-checker.ts:663
notImplementedError
▸ notImplementedError(error
): KipperNotImplementedError
Modifies the metadata for a KipperNotImplementedError
Since
0.7.0
Parameters
Name | Type | Description |
---|---|---|
error |
KipperNotImplementedError |
The KipperNotImplementedError instance. |
Returns
Inherited from
KipperSemanticsAsserter.notImplementedError
Defined in
kipper/core/src/compiler/analysis/analyser/err-handler/semantics-asserter.ts:55
objectLikeIsIndexableOrAccessible
▸ objectLikeIsIndexableOrAccessible(objLike
): void
Checks whether the members of the passed objLike can be accessed. (As well if there are members)
Throws
If the object expression is not an object.
Since
0.10.0
Parameters
Name | Type | Description |
---|---|---|
objLike |
Expression <ExpressionSemantics , ExpressionTypeSemantics , CompilableASTNode <SemanticData , TypeData >> |
The object-like expression to check. |
Returns
void
Defined in
kipper/core/src/compiler/analysis/analyser/type-checker.ts:593
refTargetCallable
▸ refTargetCallable(ref
): void
Asserts that the passed ref is callable. This function will only check ScopeDeclaration instances, since built-in functions will always be callable.
Throws
If the passed ref is not callable.
Since
0.10.0
Parameters
Name | Type | Description |
---|---|---|
ref |
Expression <ExpressionSemantics , ExpressionTypeSemantics , CompilableASTNode <SemanticData , TypeData >> | Reference <KipperReferenceable > |
The reference to check. |
Returns
void
Defined in
kipper/core/src/compiler/analysis/analyser/type-checker.ts:164
setTracebackData
▸ setTracebackData(data
): void
Sets the traceback related metadata that will be used to create a traceback for an KipperError instance.
In case that data.ctx is set and other fields are missing, these fields will be filled up using the data in the data.ctx AST node ctx instance.
Since
0.8.0
Parameters
Name | Type | Description |
---|---|---|
data |
Object |
The traceback data that will be used to initialise an KipperError instance. |
data.col? |
number |
- |
data.ctx? |
CompilableASTNode <SemanticData , TypeData > |
- |
data.filePath? |
string |
- |
data.line? |
number |
- |
data.stream? |
KipperFileStream |
- |
Returns
void
Inherited from
KipperSemanticsAsserter.setTracebackData
Defined in
kipper/core/src/compiler/analysis/analyser/err-handler/semantics-error-handler.ts:29
typeExists
▸ typeExists(type
): void
Asserts that the passed type identifier exists.
Since
0.7.0
Parameters
Name | Type | Description |
---|---|---|
type |
string |
The type to check. |
Returns
void
Defined in
kipper/core/src/compiler/analysis/analyser/type-checker.ts:100
validArgumentValue
▸ validArgumentValue(arg
, receivedType
): void
Asserts that the argument type matches the type of the argument value passed.
Example
call print("x"); // <-- Parameter type 'str' must match type of argument "x"
Throws
If the given argument type does not match the parameter type.
Since
0.7.0
Parameters
Name | Type | Description |
---|---|---|
arg |
ParameterDeclaration | BuiltInFunctionArgument |
The parameter that the value was passed to. |
receivedType |
CheckedType |
The type that was received. |
Returns
void
Defined in
kipper/core/src/compiler/analysis/analyser/type-checker.ts:263
validArithmeticExpression
▸ validArithmeticExpression(leftOp
, rightOp
, op
): void
Asserts that the passed type allows the arithmetic operation.
Throws
If the type of the left or right operand is not a number, and the operation is not a concatenation of strings.
Since
0.9.0
Parameters
Name | Type | Description |
---|---|---|
leftOp |
Expression <ExpressionSemantics , ExpressionTypeSemantics , CompilableASTNode <SemanticData , TypeData >> |
The left validBracketNotationKeyoperand expression. |
rightOp |
Expression <ExpressionSemantics , ExpressionTypeSemantics , CompilableASTNode <SemanticData , TypeData >> |
The right operand expression. |
op |
KipperArithmeticOperator |
The arithmetic operation that is performed. |
Returns
void
Defined in
kipper/core/src/compiler/analysis/analyser/type-checker.ts:393
validAssignment
▸ validAssignment(assignmentExp
): void
Asserts that the passed expression is valid and the assigned value is compatible with the identifier.
Throws
In case a arithmetic assignment operation is used with an invalid type.
Throws
If the value type can not be assigned to the identifier type.
Since
0.7.0
Parameters
Name | Type | Description |
---|---|---|
assignmentExp |
AssignmentExpression |
The assignment expression to check. |
Returns
void
Defined in
kipper/core/src/compiler/analysis/analyser/type-checker.ts:195
validBitwiseExpression
▸ validBitwiseExpression(leftOp
, rightOp
, op
): void
Asserts that the passed type allows the bitwise operation.
Throws
If the type of the left or right operand is not a number.
Since
0.11.0
Parameters
Name | Type | Description |
---|---|---|
leftOp |
Expression <ExpressionSemantics , ExpressionTypeSemantics , CompilableASTNode <SemanticData , TypeData >> |
The left operand expression. |
rightOp |
Expression <ExpressionSemantics , ExpressionTypeSemantics , CompilableASTNode <SemanticData , TypeData >> |
The right operand expression. |
op |
KipperBitwiseOperator |
The bitwise operation that is performed. |
Returns
void
Defined in
kipper/core/src/compiler/analysis/analyser/type-checker.ts:428
validBracketNotationKey
▸ validBracketNotationKey(objLike
, key
): void
Ensure the passed key may be used to access the members of the passed objLike.
Throws
In case the key type can not be used to index the object-like expression.
Since
0.10.0
Parameters
Name | Type | Description |
---|---|---|
objLike |
Expression <ExpressionSemantics , ExpressionTypeSemantics , CompilableASTNode <SemanticData , TypeData >> |
The object-like expression to check. |
key |
Expression <ExpressionSemantics , ExpressionTypeSemantics , CompilableASTNode <SemanticData , TypeData >> |
The key that accesses the members of the object-like expression. |
Returns
void
Defined in
kipper/core/src/compiler/analysis/analyser/type-checker.ts:614
validConditionalExpression
▸ validConditionalExpression(trueBranch
, falseBranch
): void
Checks whether the conditional expression is valid.
Throws
When the branch types are mismatching, as union types are not implemented yet.
Since
0.11.0
Parameters
Name | Type | Description |
---|---|---|
trueBranch |
Expression <ExpressionSemantics , ExpressionTypeSemantics , CompilableASTNode <SemanticData , TypeData >> |
The expression which is called when the condition evaluates to true. |
falseBranch |
Expression <ExpressionSemantics , ExpressionTypeSemantics , CompilableASTNode <SemanticData , TypeData >> |
The expression which is called when the condition evaluates to false. |
Returns
void
Defined in
kipper/core/src/compiler/analysis/analyser/type-checker.ts:721
validConversion
▸ validConversion(operand
, targetType
): void
Asserts that the type conversion for the operand is valid.
Throws
If the conversion is invalid/impossible.
Since
0.8.0
Parameters
Name | Type | Description |
---|---|---|
operand |
Expression <ExpressionSemantics , ExpressionTypeSemantics , CompilableASTNode <SemanticData , TypeData >> |
The expression to convert. |
targetType |
CheckedType |
The type to convert to. |
Returns
void
Defined in
kipper/core/src/compiler/analysis/analyser/type-checker.ts:450
validFunctionCallArguments
▸ validFunctionCallArguments(func
, args
): void
Asserts that the passed function arguments are valid.
Throws
If the amount of arguments is invalid e.g. too many or too few.
Throws
If any given argument type does not match the required parameter type.
Since
0.7.0
Parameters
Name | Type | Description |
---|---|---|
func |
KipperReferenceableFunction |
The function that is called. |
args |
Expression <ExpressionSemantics , ExpressionTypeSemantics , CompilableASTNode <SemanticData , TypeData >>[] |
The arguments for the call expression. |
Returns
void
Defined in
kipper/core/src/compiler/analysis/analyser/type-checker.ts:298
validRelationalExpression
▸ validRelationalExpression(exp
): void
Asserts that the passed relational expression is valid.
Throws
If the value types can not be compared.
Since
0.9.0
Parameters
Name | Type | Description |
---|---|---|
exp |
RelationalExpression |
The relational expression to check. |
Returns
void
Defined in
kipper/core/src/compiler/analysis/analyser/type-checker.ts:318
validReturnCodePathsInFunctionBody
▸ validReturnCodePathsInFunctionBody(func
): void
Ensures that the body of the func has valid return statements and all code paths return a value.
Requires func.typeSemantics to be set.
Throws
If not all code paths return a value.
Since
0.10.0
Parameters
Name | Type | Description |
---|---|---|
func |
LambdaExpression | FunctionDeclaration |
The function where the body should be checked. |
Returns
void
Defined in
kipper/core/src/compiler/analysis/analyser/type-checker.ts:510
validReturnStatement
▸ validReturnStatement(returnStatement
): void
Asserts that the passed return statement is valid.
Throws
If the type of the return value does not match the return type of the function.
Since
0.10.0
Parameters
Name | Type | Description |
---|---|---|
returnStatement |
ReturnStatement |
The return statement to check. |
Returns
void
Defined in
kipper/core/src/compiler/analysis/analyser/type-checker.ts:478
validSliceNotationKey
▸ validSliceNotationKey(objLike
, key
): void
Ensure the passed slice keys may be used to access the members of the passed objLike.
Throws
In case the key type can not be used to index the object-like expression.
Since
0.10.0
Parameters
Name | Type | Description |
---|---|---|
objLike |
Expression <ExpressionSemantics , ExpressionTypeSemantics , CompilableASTNode <SemanticData , TypeData >> |
The object-like expression to check. |
key |
Object |
The key that accesses the members of the object-like expression. |
key.end? |
Expression <ExpressionSemantics , ExpressionTypeSemantics , CompilableASTNode <SemanticData , TypeData >> |
- |
key.start? |
Expression <ExpressionSemantics , ExpressionTypeSemantics , CompilableASTNode <SemanticData , TypeData >> |
- |
Returns
void
Defined in
kipper/core/src/compiler/analysis/analyser/type-checker.ts:636
validUnaryExpression
▸ validUnaryExpression(operand
): void
Asserts that the passed unary expression is valid by checking its operand.semanticData.operand operand and operand.semanticData.operator operator.
Throws
If the operand is not a valid operand for the operator.
Since
0.9.0
Parameters
Name | Type | Description |
---|---|---|
operand |
IncrementOrDecrementPostfixExpression | UnaryExpression <UnaryExpressionSemantics , UnaryExpressionTypeSemantics > |
The unary expression to check. (Also includes IncrementOrDecrementPostfixExpression, since even if it's a postfix expression, it's still a unary expression) |
Returns
void
Defined in
kipper/core/src/compiler/analysis/analyser/type-checker.ts:346
validVariableDefinition
▸ validVariableDefinition(scopeEntry
, value
): void
Asserts that this variable definition is valid and the assigned value is compatible with the identifier.
Throws
If the assignment value type is not compatible with the definition type.
Since
0.7.0
Parameters
Name | Type | Description |
---|---|---|
scopeEntry |
ScopeVariableDeclaration |
The scope entry/variable being assigned to. |
value |
Expression <ExpressionSemantics , ExpressionTypeSemantics , CompilableASTNode <SemanticData , TypeData >> |
The right expression/value of the assignment. |
Returns
void
Defined in
kipper/core/src/compiler/analysis/analyser/type-checker.ts:238
getTypeForAnalysis
▸ Static
getTypeForAnalysis(type
): undefined
| KipperCompilableType
Gets the type that should be used for the type checking from the provided CheckedType.
This function is intended to check for UndefinedCustomType, which is a special type that is created during error recovery to indicate a type is invalid/undefined. This type should be always ignored and as such this function will return undefined, so that they type checking is skipped. (This is fine, since the compiler should have already thrown an error at the creation of the UndefinedCustomType.)
Parameters
Name | Type | Description |
---|---|---|
type |
CheckedType |
The CheckedType instance. |
Returns
undefined
| KipperCompilableType
Defined in
kipper/core/src/compiler/analysis/analyser/type-checker.ts:88