50
50
import net .starlark .java .syntax .TokenKind ;
51
51
import net .starlark .java .syntax .UnaryOperatorExpression ;
52
52
import net .starlark .java .types .StarlarkType ;
53
+ import net .starlark .java .types .Types .CallableType ;
53
54
54
55
final class Eval {
55
56
@@ -167,6 +168,7 @@ private static StarlarkFunction newFunction(StarlarkThread.Frame fr, Resolver.Fu
167
168
Object [] defaults = null ;
168
169
int nparams =
169
170
rfn .getParameters ().size () - (rfn .hasKwargs () ? 1 : 0 ) - (rfn .hasVarargs () ? 1 : 0 );
171
+ CallableType functionType = rfn .getFunctionType ();
170
172
for (int i = 0 ; i < nparams ; i ++) {
171
173
Expression expr = rfn .getParameters ().get (i ).getDefaultValue ();
172
174
if (expr == null && defaults == null ) {
@@ -179,14 +181,16 @@ private static StarlarkFunction newFunction(StarlarkThread.Frame fr, Resolver.Fu
179
181
defaults [i - (nparams - defaults .length )] = defaultValue ;
180
182
181
183
// Typecheck the default value
182
- StarlarkType parameterType = rfn .getFunctionType ().getParameterTypeByPos (i );
183
- if (!TypeChecker .isValueSubtypeOf (defaultValue , parameterType )) {
184
- throw Starlark .errorf (
185
- "%s(): parameter '%s' has default value of type '%s', declares '%s'" ,
186
- rfn .getName (),
187
- rfn .getParameterNames ().get (i ),
188
- TypeChecker .type (defaultValue ),
189
- parameterType );
184
+ if (functionType != null ) {
185
+ StarlarkType parameterType = functionType .getParameterTypeByPos (i );
186
+ if (!TypeChecker .isValueSubtypeOf (defaultValue , parameterType )) {
187
+ throw Starlark .errorf (
188
+ "%s(): parameter '%s' has default value of type '%s', declares '%s'" ,
189
+ rfn .getName (),
190
+ rfn .getParameterNames ().get (i ),
191
+ TypeChecker .type (defaultValue ),
192
+ parameterType );
193
+ }
190
194
}
191
195
}
192
196
if (defaults == null ) {
0 commit comments