@@ -373,3 +373,89 @@ private module ExprToStmtSynth {
373
373
}
374
374
}
375
375
}
376
+
377
+ predicate excludeFunctionDefinitionStmt ( Raw:: FunctionDefinitionStmt f ) {
378
+ // We don't care about function definition statements which define methods
379
+ // because they live inside a type anyway (and we don't have control-flow
380
+ // inside a type).
381
+ parent ( f , any ( Raw:: Method m ) )
382
+ }
383
+
384
+ /**
385
+ * Synthesize function "declarations" from function definitions statements.
386
+ */
387
+ private module FunctionSynth {
388
+ private class FunctionSynth extends Synthesis {
389
+ override predicate child ( Raw:: Ast parent , ChildIndex i , Child child ) {
390
+ i = funDefFun ( ) and
391
+ child = SynthChild ( FunctionSynthKind ( ) ) and
392
+ exists ( Raw:: FunctionDefinitionStmt fundefStmt |
393
+ if excludeFunctionDefinitionStmt ( fundefStmt )
394
+ then parent ( fundefStmt , parent )
395
+ else parent = fundefStmt
396
+ )
397
+ }
398
+
399
+ override predicate functionName ( FunctionBase f , string name ) {
400
+ exists ( Raw:: FunctionDefinitionStmt fundefStmt |
401
+ f = TFunctionSynth ( fundefStmt , _) and
402
+ fundefStmt .getName ( ) = name
403
+ )
404
+ or
405
+ exists ( Raw:: TopLevelScriptBlock topLevelScriptBlock |
406
+ f = TTopLevelFunction ( topLevelScriptBlock ) and
407
+ name = "toplevel function for " + topLevelScriptBlock .getLocation ( ) .getFile ( ) .getBaseName ( )
408
+ )
409
+ }
410
+
411
+ override predicate functionScriptBlock ( FunctionBase f , ScriptBlock block ) {
412
+ exists ( Raw:: FunctionDefinitionStmt fundefStmt |
413
+ f = TFunctionSynth ( fundefStmt , _) and
414
+ getResultAst ( fundefStmt .getBody ( ) ) = block
415
+ )
416
+ or
417
+ exists ( Raw:: TopLevelScriptBlock topLevelScriptBlock |
418
+ block = getResultAst ( topLevelScriptBlock ) and
419
+ f = TTopLevelFunction ( topLevelScriptBlock )
420
+ )
421
+ }
422
+
423
+ override Location getLocation ( Ast n ) {
424
+ exists ( Raw:: FunctionDefinitionStmt fundefStmt |
425
+ n = TFunctionSynth ( fundefStmt , _) and
426
+ result = fundefStmt .getLocation ( )
427
+ )
428
+ }
429
+ }
430
+ }
431
+
432
+ private module TypeSynth {
433
+ private class TypeSynth extends Synthesis {
434
+ override predicate child ( Raw:: Ast parent , ChildIndex i , Child child ) {
435
+ parent instanceof Raw:: TypeStmt and
436
+ i = typeDefType ( ) and
437
+ child = SynthChild ( TypeSynthKind ( ) )
438
+ }
439
+
440
+ final override predicate typeMember ( Type t , int i , Member m ) {
441
+ exists ( Raw:: TypeStmt typeStmt |
442
+ t = TTypeSynth ( typeStmt , _) and
443
+ m = getResultAst ( typeStmt .getMember ( i ) )
444
+ )
445
+ }
446
+
447
+ override predicate typeName ( Type t , string name ) {
448
+ exists ( Raw:: TypeStmt typeStmt |
449
+ t = TTypeSynth ( typeStmt , _) and
450
+ typeStmt .getName ( ) = name
451
+ )
452
+ }
453
+
454
+ override Location getLocation ( Ast n ) {
455
+ exists ( Raw:: TypeStmt typeStmt |
456
+ n = TTypeSynth ( typeStmt , _) and
457
+ result = typeStmt .getLocation ( )
458
+ )
459
+ }
460
+ }
461
+ }
0 commit comments