1
1
import { AstNode , getContainerOfType , ValidationAcceptor } from 'langium' ;
2
+ import { isEmpty } from '../../helpers/collectionUtils.js' ;
3
+ import { pluralize } from '../../helpers/stringUtils.js' ;
2
4
import {
3
5
isSdsAnnotation ,
4
6
isSdsCallable ,
@@ -21,8 +23,6 @@ import {
21
23
} from '../generated/ast.js' ;
22
24
import { getTypeArguments , getTypeParameters } from '../helpers/nodeProperties.js' ;
23
25
import { SafeDsServices } from '../safe-ds-module.js' ;
24
- import { pluralize } from '../../helpers/stringUtils.js' ;
25
- import { isEmpty } from '../../helpers/collectionUtils.js' ;
26
26
27
27
export const CODE_TYPE_CALLABLE_RECEIVER = 'type/callable-receiver' ;
28
28
export const CODE_TYPE_MISMATCH = 'type/mismatch' ;
@@ -76,12 +76,12 @@ export const callReceiverMustBeCallable = (services: SafeDsServices) => {
76
76
}
77
77
78
78
const callable = nodeMapper . callToCallable ( node ) ;
79
- if ( ! callable || isSdsAnnotation ( callable ) ) {
79
+ if ( node . receiver && ( ! callable || isSdsAnnotation ( callable ) ) ) {
80
80
accept ( 'error' , 'This expression is not callable.' , {
81
81
node : node . receiver ,
82
82
code : CODE_TYPE_CALLABLE_RECEIVER ,
83
83
} ) ;
84
- } else if ( isSdsClass ( callable ) && ! callable . parameterList ) {
84
+ } else if ( node . receiver && isSdsClass ( callable ) && ! callable . parameterList ) {
85
85
accept ( 'error' , 'Cannot instantiate a class that has no constructor.' , {
86
86
node : node . receiver ,
87
87
code : CODE_TYPE_CALLABLE_RECEIVER ,
@@ -98,6 +98,7 @@ export const indexedAccessReceiverMustBeListOrMap = (services: SafeDsServices) =
98
98
return ( node : SdsIndexedAccess , accept : ValidationAcceptor ) : void => {
99
99
const receiverType = typeComputer . computeType ( node . receiver ) ;
100
100
if (
101
+ node . receiver &&
101
102
! typeChecker . isAssignableTo ( receiverType , coreTypes . List ) &&
102
103
! typeChecker . isAssignableTo ( receiverType , coreTypes . Map )
103
104
) {
@@ -140,13 +141,13 @@ export const infixOperationOperandsMustHaveCorrectType = (services: SafeDsServic
140
141
switch ( node . operator ) {
141
142
case 'or' :
142
143
case 'and' :
143
- if ( ! typeChecker . isAssignableTo ( leftType , coreTypes . Boolean ) ) {
144
+ if ( node . leftOperand && ! typeChecker . isAssignableTo ( leftType , coreTypes . Boolean ) ) {
144
145
accept ( 'error' , `Expected type '${ coreTypes . Boolean } ' but got '${ leftType } '.` , {
145
146
node : node . leftOperand ,
146
147
code : CODE_TYPE_MISMATCH ,
147
148
} ) ;
148
149
}
149
- if ( ! typeChecker . isAssignableTo ( rightType , coreTypes . Boolean ) ) {
150
+ if ( node . rightOperand && ! typeChecker . isAssignableTo ( rightType , coreTypes . Boolean ) ) {
150
151
accept ( 'error' , `Expected type '${ coreTypes . Boolean } ' but got '${ rightType } '.` , {
151
152
node : node . rightOperand ,
152
153
code : CODE_TYPE_MISMATCH ,
@@ -162,6 +163,7 @@ export const infixOperationOperandsMustHaveCorrectType = (services: SafeDsServic
162
163
case '*' :
163
164
case '/' :
164
165
if (
166
+ node . leftOperand &&
165
167
! typeChecker . isAssignableTo ( leftType , coreTypes . Float ) &&
166
168
! typeChecker . isAssignableTo ( leftType , coreTypes . Int )
167
169
) {
@@ -171,6 +173,7 @@ export const infixOperationOperandsMustHaveCorrectType = (services: SafeDsServic
171
173
} ) ;
172
174
}
173
175
if (
176
+ node . rightOperand &&
174
177
! typeChecker . isAssignableTo ( rightType , coreTypes . Float ) &&
175
178
! typeChecker . isAssignableTo ( rightType , coreTypes . Int )
176
179
) {
0 commit comments