Skip to content

Commit 06acb7f

Browse files
committed
fix: expand @generated detection to 10 lines with word-boundary check
1 parent af02d19 commit 06acb7f

File tree

2 files changed

+177
-2
lines changed

2 files changed

+177
-2
lines changed

src/treemapper/diffctx/__init__.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -185,9 +185,14 @@ def _is_generated_file(path: Path, content: str) -> bool:
185185
if part.lower() in _GENERATED_PATH_SEGMENTS:
186186
return True
187187

188-
header_lower = "\n".join(content.splitlines()[:5]).lower()
188+
header_lower = "\n".join(content.splitlines()[:10]).lower()
189189
for marker in _GENERATED_CONTENT_MARKERS:
190-
if marker in header_lower:
190+
if marker not in header_lower:
191+
continue
192+
if marker == "@generated":
193+
if re.search(r"@generated(?![a-z])", header_lower):
194+
return True
195+
else:
191196
return True
192197

193198
return False
Lines changed: 170 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
# Scenario: Meta-style @generated marker appears on line 7+ (after 6-line copyright header).
2+
#
3+
# The @generated SignedSource marker is standard in Meta (React Native, etc.) codebases.
4+
# The copyright header takes lines 1-6, and @generated appears on line 7.
5+
# The generated file detection must scan enough lines to catch this pattern.
6+
#
7+
# Expected: The generated file (feature_flags.kt) should be detected as generated
8+
# and receive at most 5 fragments with 30-line truncation.
9+
# The actual changed file (config.py) must appear in output.
10+
11+
max_enrichment: 15.0
12+
initial:
13+
config.py: |
14+
FEATURE_FLAGS = {
15+
"dark_mode": True,
16+
"beta_access": False,
17+
}
18+
19+
def get_flag(name: str) -> bool:
20+
return FEATURE_FLAGS.get(name, False)
21+
generated/feature_flags.kt: |
22+
/*
23+
* Copyright (c) Meta Platforms, Inc. and affiliates.
24+
*
25+
* This source code is licensed under the MIT license found in the
26+
* LICENSE file in the root directory of this source tree.
27+
*
28+
* @generated SignedSource<<abcdef1234567890>>
29+
*/
30+
31+
package com.facebook.react.internal.featureflags
32+
33+
object ReactNativeFeatureFlagsDefaults {
34+
fun enableMicrotasks(): Boolean = false
35+
fun enableSpannableBuildingUnification(): Boolean = false
36+
fun inspectorEnableCxxInspectorPackagerConnection(): Boolean = false
37+
fun inspectorEnableModernCDPRegistry(): Boolean = false
38+
fun useModernRuntimeScheduler(): Boolean = false
39+
fun animatedShouldDebounceQueueFlush(): Boolean = false
40+
fun animatedShouldUseSingleOp(): Boolean = false
41+
fun enableAccessToHostTreeInFabric(): Boolean = false
42+
fun enableAlignItemsBaselineOnFabricIOS(): Boolean = false
43+
fun enableBridgelessArchitecture(): Boolean = false
44+
fun enableCleanTextInputYogaNode(): Boolean = false
45+
fun enableDeletionOfUnmountedViews(): Boolean = false
46+
fun enableFabricLogs(): Boolean = false
47+
fun enableFabricRendererExclusively(): Boolean = false
48+
fun enableGranularShadowTreeStateReconciliation(): Boolean = false
49+
fun enableLayoutAnimationsOnAndroid(): Boolean = false
50+
fun enableLayoutAnimationsOnIOS(): Boolean = false
51+
fun enableLongTaskAPI(): Boolean = false
52+
fun enableNewBackgroundAndBorderDrawables(): Boolean = false
53+
fun enablePreciseSchedulingForPremountItemsOnFabric(): Boolean = false
54+
fun enablePropsUpdateReconciliationAndroid(): Boolean = false
55+
fun enableReportEventPaintTime(): Boolean = false
56+
fun enableSynchronousStateUpdates(): Boolean = false
57+
fun enableUIConsistency(): Boolean = false
58+
fun enableViewRecycling(): Boolean = false
59+
fun excludeYogaFromRawProps(): Boolean = false
60+
fun fixMountingCoordinatorReportedPendingTransactionsOnAndroid(): Boolean = false
61+
fun forceBatchingMountItemsOnAndroid(): Boolean = false
62+
fun fuseboxEnabledDebug(): Boolean = false
63+
fun fuseboxEnabledRelease(): Boolean = false
64+
fun initEagerTurboModulesOnNativeModulesQueueAndroid(): Boolean = false
65+
fun lazyAnimationCallbacks(): Boolean = false
66+
fun loadVectorDrawablesOnImages(): Boolean = false
67+
fun traceTurboModulePromiseRejectionsOnAndroid(): Boolean = false
68+
fun useAlwaysAvailableJSErrorHandling(): Boolean = false
69+
fun useFabricInterop(): Boolean = false
70+
fun useImmediateExecutorInAndroidBridgeless(): Boolean = false
71+
fun useNativeViewConfigsInBridgelessMode(): Boolean = false
72+
fun useOptimisedViewPreallocationOnAndroid(): Boolean = false
73+
fun useOptimizedEventBatchingOnAndroid(): Boolean = false
74+
fun useRuntimeShadowNodeReferenceUpdate(): Boolean = false
75+
fun useTurboModuleInterop(): Boolean = false
76+
fun useTurboModules(): Boolean = false
77+
}
78+
garbage_int069_unrelated.py: |
79+
GARBAGE_INT069_MARKER_A = "noise_a"
80+
def process_garbage():
81+
return "GARBAGE_INT069_MARKER_B"
82+
class GarbageHandler:
83+
GARBAGE_INT069_MARKER_C = "noise_c"
84+
garbage_int069_extra.py: |
85+
GARBAGE_INT069_EXTRA_MARKER_A = "extra_a"
86+
def extra_func():
87+
return "GARBAGE_INT069_EXTRA_MARKER_B"
88+
changed:
89+
config.py: |
90+
FEATURE_FLAGS = {
91+
"dark_mode": True,
92+
"beta_access": False,
93+
"long_task_api": True,
94+
}
95+
96+
def get_flag(name: str) -> bool:
97+
return FEATURE_FLAGS.get(name, False)
98+
generated/feature_flags.kt: |
99+
/*
100+
* Copyright (c) Meta Platforms, Inc. and affiliates.
101+
*
102+
* This source code is licensed under the MIT license found in the
103+
* LICENSE file in the root directory of this source tree.
104+
*
105+
* @generated SignedSource<<abcdef1234567891>>
106+
*/
107+
108+
package com.facebook.react.internal.featureflags
109+
110+
object ReactNativeFeatureFlagsDefaults {
111+
fun enableMicrotasks(): Boolean = false
112+
fun enableSpannableBuildingUnification(): Boolean = false
113+
fun inspectorEnableCxxInspectorPackagerConnection(): Boolean = false
114+
fun inspectorEnableModernCDPRegistry(): Boolean = false
115+
fun useModernRuntimeScheduler(): Boolean = false
116+
fun animatedShouldDebounceQueueFlush(): Boolean = false
117+
fun animatedShouldUseSingleOp(): Boolean = false
118+
fun enableAccessToHostTreeInFabric(): Boolean = false
119+
fun enableAlignItemsBaselineOnFabricIOS(): Boolean = false
120+
fun enableBridgelessArchitecture(): Boolean = false
121+
fun enableCleanTextInputYogaNode(): Boolean = false
122+
fun enableDeletionOfUnmountedViews(): Boolean = false
123+
fun enableFabricLogs(): Boolean = false
124+
fun enableFabricRendererExclusively(): Boolean = false
125+
fun enableGranularShadowTreeStateReconciliation(): Boolean = false
126+
fun enableLayoutAnimationsOnAndroid(): Boolean = false
127+
fun enableLayoutAnimationsOnIOS(): Boolean = false
128+
fun enableLongTaskAPI(): Boolean = true
129+
fun enableNewBackgroundAndBorderDrawables(): Boolean = false
130+
fun enablePreciseSchedulingForPremountItemsOnFabric(): Boolean = false
131+
fun enablePropsUpdateReconciliationAndroid(): Boolean = false
132+
fun enableReportEventPaintTime(): Boolean = false
133+
fun enableSynchronousStateUpdates(): Boolean = false
134+
fun enableUIConsistency(): Boolean = false
135+
fun enableViewRecycling(): Boolean = false
136+
fun excludeYogaFromRawProps(): Boolean = false
137+
fun fixMountingCoordinatorReportedPendingTransactionsOnAndroid(): Boolean = false
138+
fun forceBatchingMountItemsOnAndroid(): Boolean = false
139+
fun fuseboxEnabledDebug(): Boolean = false
140+
fun fuseboxEnabledRelease(): Boolean = false
141+
fun initEagerTurboModulesOnNativeModulesQueueAndroid(): Boolean = false
142+
fun lazyAnimationCallbacks(): Boolean = false
143+
fun loadVectorDrawablesOnImages(): Boolean = false
144+
fun traceTurboModulePromiseRejectionsOnAndroid(): Boolean = false
145+
fun useAlwaysAvailableJSErrorHandling(): Boolean = false
146+
fun useFabricInterop(): Boolean = false
147+
fun useImmediateExecutorInAndroidBridgeless(): Boolean = false
148+
fun useNativeViewConfigsInBridgelessMode(): Boolean = false
149+
fun useOptimisedViewPreallocationOnAndroid(): Boolean = false
150+
fun useOptimizedEventBatchingOnAndroid(): Boolean = false
151+
fun useRuntimeShadowNodeReferenceUpdate(): Boolean = false
152+
fun useTurboModuleInterop(): Boolean = false
153+
fun useTurboModules(): Boolean = false
154+
}
155+
must_include_files:
156+
- config.py
157+
must_include_content_from:
158+
config.py:
159+
- long_task_api
160+
must_not_include:
161+
- GARBAGE_INT069_MARKER_A
162+
- GARBAGE_INT069_MARKER_B
163+
- GARBAGE_INT069_MARKER_C
164+
- GARBAGE_INT069_EXTRA_MARKER_A
165+
- GARBAGE_INT069_EXTRA_MARKER_B
166+
must_not_include_files:
167+
- garbage_int069_unrelated.py
168+
- garbage_int069_extra.py
169+
max_fragments: 8
170+
max_files: 3

0 commit comments

Comments
 (0)