@@ -6,117 +6,67 @@ private import OverlayXml
66
77/**
88 * Holds always for the overlay variant and never for the base variant.
9- * This local predicate is used to define local predicates that behave
10- * differently for the base and overlay variant.
119 */
1210overlay [ local]
1311predicate isOverlay ( ) { databaseMetadata ( "isOverlay" , "true" ) }
1412
15- overlay [ local]
16- private string getLocationFilePath ( @location_default loc ) {
17- exists ( @file file | locations_default ( loc , file , _, _, _, _) | files ( file , result ) )
18- }
19-
20- /**
21- * Gets the file path for an element with a single location.
22- */
23- overlay [ local]
24- private string getSingleLocationFilePath ( @element e ) {
25- exists ( @location_default loc |
26- var_decls ( e , _, _, _, loc )
27- or
28- fun_decls ( e , _, _, _, loc )
29- or
30- type_decls ( e , _, loc )
31- or
32- namespace_decls ( e , _, loc , _)
33- or
34- macroinvocations ( e , _, loc , _)
35- or
36- preprocdirects ( e , _, loc )
37- or
38- diagnostics ( e , _, _, _, _, loc )
39- or
40- usings ( e , _, loc , _)
41- or
42- static_asserts ( e , _, _, loc , _)
43- or
44- derivations ( e , _, _, _, loc )
45- or
46- frienddecls ( e , _, _, loc )
47- or
48- comments ( e , _, loc )
49- or
50- exprs ( e , _, loc )
51- or
52- stmts ( e , _, loc )
53- or
54- initialisers ( e , _, _, loc )
55- or
56- attributes ( e , _, _, _, loc )
57- or
58- attribute_args ( e , _, _, _, loc )
59- or
60- namequalifiers ( e , _, _, loc )
61- or
62- enumconstants ( e , _, _, _, _, loc )
63- or
64- type_mentions ( e , _, loc , _)
65- or
66- lambda_capture ( e , _, _, _, _, _, loc )
67- or
68- concept_templates ( e , _, loc )
69- |
70- result = getLocationFilePath ( loc )
71- )
72- }
73-
7413/**
75- * Gets the file path for an element with potentially multiple locations.
14+ * Holds if the TRAP file or tag `t` is reachable from source file `sourceFile`
15+ * in the base (isOverlayVariant=false) or overlay (isOverlayVariant=true) variant.
7616 */
7717overlay [ local]
78- private string getMultiLocationFilePath ( @element e ) {
79- exists ( @location_default loc |
80- var_decls ( _, e , _, _, loc )
81- or
82- fun_decls ( _, e , _, _, loc )
83- or
84- type_decls ( _, e , loc )
85- or
86- namespace_decls ( _, e , loc , _)
87- |
88- result = getLocationFilePath ( loc )
18+ private predicate locallyReachableTrapOrTag (
19+ boolean isOverlayVariant , string sourceFile , @trap_or_tag t
20+ ) {
21+ exists ( @source_file sf , @trap trap |
22+ ( if isOverlay ( ) then isOverlayVariant = true else isOverlayVariant = false ) and
23+ source_file_uses_trap ( sf , trap ) and
24+ source_file_name ( sf , sourceFile ) and
25+ ( t = trap or trap_uses_tag ( trap , t ) )
8926 )
9027}
9128
9229/**
93- * A local helper predicate that holds in the base variant and never in the
94- * overlay variant.
95- */
96- overlay [ local]
97- private predicate isBase ( ) { not isOverlay ( ) }
98-
99- /**
100- * Holds if `path` was extracted in the overlay database.
30+ * Holds if element `e` is in TRAP file or tag `t`
31+ * in the base (isOverlayVariant=false) or overlay (isOverlayVariant=true) variant.
10132 */
10233overlay [ local]
103- private predicate overlayHasFile ( string path ) {
104- isOverlay ( ) and
105- files ( _, path ) and
106- path != ""
34+ private predicate locallyInTrapOrTag ( boolean isOverlayVariant , @element e , @trap_or_tag t ) {
35+ ( if isOverlay ( ) then isOverlayVariant = true else isOverlayVariant = false ) and
36+ in_trap_or_tag ( e , t )
10737}
10838
10939/**
11040 * Discards an element from the base variant if:
111- * - It has a single location in a file extracted in the overlay, or
112- * - All of its locations are in files extracted in the overlay.
41+ * - We have knowledge about what TRAP file or tag it is in (in the base).
42+ * - It is not in any overlay TRAP file or tag that is reachable from an overlay source file.
43+ * - For every base TRAP file or tag that contains it and is reachable from a base source file,
44+ * either the source file has changed, or the overlay has redefined the TRAP file or tag,
45+ * or the overlay runner has re-extracted the same source file.
11346 */
11447overlay [ discard_entity]
11548private predicate discardElement ( @element e ) {
116- isBase ( ) and
117- (
118- overlayHasFile ( getSingleLocationFilePath ( e ) )
119- or
120- forex ( string path | path = getMultiLocationFilePath ( e ) | overlayHasFile ( path ) )
49+ // If we don't have any knowledge about what TRAP file something
50+ // is in, then we don't want to discard it, so we only consider
51+ // entities that are known to be in a base TRAP file or tag.
52+ locallyInTrapOrTag ( false , e , _) and
53+ // Anything that is reachable from an overlay source file should
54+ // not be discarded.
55+ not exists ( @trap_or_tag t | locallyInTrapOrTag ( true , e , t ) |
56+ locallyReachableTrapOrTag ( true , _, t )
57+ ) and
58+ // Finally, we have to make sure the base variant does not retain it.
59+ // If it is reachable from a base source file, then that is
60+ // sufficient unless either the base source file has changed (in
61+ // particular, been deleted), or the overlay has redefined the TRAP
62+ // file or tag it is in, or the overlay runner has re-extracted the same
63+ // source file (e.g. because a header it includes has changed).
64+ forall ( @trap_or_tag t , string sourceFile |
65+ locallyInTrapOrTag ( false , e , t ) and
66+ locallyReachableTrapOrTag ( false , sourceFile , t )
67+ |
68+ overlayChangedFiles ( sourceFile ) or
69+ locallyReachableTrapOrTag ( true , _, t ) or
70+ locallyReachableTrapOrTag ( true , sourceFile , _)
12171 )
12272}
0 commit comments