|
48 | 48 | import com.oracle.graal.python.builtins.objects.cell.PCell;
|
49 | 49 | import com.oracle.graal.python.builtins.objects.code.PCode;
|
50 | 50 | import com.oracle.graal.python.builtins.objects.common.PHashingCollection;
|
| 51 | +import com.oracle.graal.python.builtins.objects.function.Arity.KeywordName; |
51 | 52 | import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod;
|
52 | 53 | import com.oracle.graal.python.builtins.objects.method.PMethod;
|
53 | 54 | import com.oracle.graal.python.builtins.objects.module.PythonModule;
|
|
63 | 64 | import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
|
64 | 65 | import com.oracle.graal.python.nodes.subscript.GetItemNode;
|
65 | 66 | import com.oracle.truffle.api.CompilerDirectives;
|
| 67 | +import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; |
66 | 68 | import com.oracle.truffle.api.dsl.Cached;
|
67 | 69 | import com.oracle.truffle.api.dsl.Fallback;
|
68 | 70 | import com.oracle.truffle.api.dsl.GenerateNodeFactory;
|
@@ -283,7 +285,65 @@ Object builtinCode(PBuiltinFunction self) {
|
283 | 285 | public abstract static class TextSignatureNode extends PythonUnaryBuiltinNode {
|
284 | 286 | @Specialization
|
285 | 287 | protected Object doStatic(@SuppressWarnings("unused") PBuiltinFunction self) {
|
286 |
| - return ""; |
| 288 | + boolean enclosingType = self.getEnclosingType() != null; |
| 289 | + Arity arity = self.getArity(); |
| 290 | + return getSignature(enclosingType, arity); |
| 291 | + } |
| 292 | + |
| 293 | + @Specialization |
| 294 | + protected Object doStatic(@SuppressWarnings("unused") PFunction self) { |
| 295 | + boolean enclosingType = self.getEnclosingClassName() != null; |
| 296 | + Arity arity = self.getArity(); |
| 297 | + return getSignature(enclosingType, arity); |
| 298 | + } |
| 299 | + |
| 300 | + @TruffleBoundary |
| 301 | + private static Object getSignature(boolean enclosingType, Arity arity) { |
| 302 | + int minArgs = arity.getMinNumOfPositionalArgs(); |
| 303 | + KeywordName[] keywordNames = arity.getKeywordNames(); |
| 304 | + int requiredKeywords = arity.getNumOfRequiredKeywords(); |
| 305 | + boolean takesVarArgs = arity.takesVarArgs(); |
| 306 | + boolean takesVarKeywordArgs = arity.takesVarKeywordArgs(); |
| 307 | + |
| 308 | + StringBuilder sb = new StringBuilder(); |
| 309 | + char argName = 'a'; |
| 310 | + sb.append('('); |
| 311 | + if (minArgs > 0) { |
| 312 | + if (!enclosingType) { |
| 313 | + sb.append("$module"); |
| 314 | + } else { |
| 315 | + sb.append("self"); |
| 316 | + } |
| 317 | + for (int i = 1; i < minArgs; i++) { |
| 318 | + sb.append(", ").append(argName++); |
| 319 | + } |
| 320 | + } |
| 321 | + if (minArgs > 0) { |
| 322 | + sb.append(", /"); |
| 323 | + } |
| 324 | + if (keywordNames.length > 0) { |
| 325 | + int i = 0; |
| 326 | + while (i < requiredKeywords) { |
| 327 | + sb.append(", ").append(keywordNames[i++]); |
| 328 | + } |
| 329 | + if (takesVarArgs) { |
| 330 | + sb.append(", *args"); |
| 331 | + } else { |
| 332 | + sb.append(", *"); |
| 333 | + } |
| 334 | + while (i < keywordNames.length) { |
| 335 | + sb.append(", ").append(keywordNames[i]).append("=?"); |
| 336 | + } |
| 337 | + if (takesVarKeywordArgs) { |
| 338 | + sb.append(", **kwargs"); |
| 339 | + } |
| 340 | + } |
| 341 | + sb.append(')'); |
| 342 | + return sb.toString(); |
| 343 | + } |
| 344 | + |
| 345 | + public static TextSignatureNode create() { |
| 346 | + return AbstractFunctionBuiltinsFactory.TextSignatureNodeFactory.create(); |
287 | 347 | }
|
288 | 348 | }
|
289 | 349 | }
|
0 commit comments