diff --git a/graph/bundle/SCHEMA.md b/graph/bundle/SCHEMA.md index 914b3c9b8..6766d5259 100644 --- a/graph/bundle/SCHEMA.md +++ b/graph/bundle/SCHEMA.md @@ -672,7 +672,7 @@ Methods the runtime invokes without a client call site — process roots, test m **Notes** -- **python** — EMPTY. The Python rule set does not derive entry points; entry_reachable is therefore empty too. +- **python** — Framework entry points only: url, http, orm_hook, task, signal_receiver, fixture, di_provider and grpc_service. There is no test and no main reason: a pytest test is recognised by the query layer from its file and name, not here. ### `entry_reachable` @@ -729,7 +729,7 @@ Every field-like storage location the graph refers to: all client fields and enu **Notes** -- **all** — JAVA AND TYPESCRIPT, for the same reason as field_access: declared everywhere, populated by those two front ends. +- **all** — JAVA, TYPESCRIPT AND C#. EMPTY for Python and JavaScript: a Python attribute is a symbols row of kind field. In C# it holds true fields only; a property is a symbols row of kind field with a property id, and its accessors are methods rows (PROPERTY_GET, PROPERTY_SET, PROPERTY_INIT). - **typescript** — An enum member is absent: the parser gives it its own table with no declared type, and the property-access relation resolves through the field table. `Colour.Red` is therefore an unresolved field access, unlike Java where an enum constant is a fields row. - **java** — A library field is listed when some field_access edge reaches it, exactly as methods lists only the library methods an edge reaches, OR when a config_binding row names it as the field a configuration key binds to. The second was added in #890: a @Value field on a library type that nothing reads has no access edge, so config_binding named a field the table did not list and the join lost the row silently. @@ -888,7 +888,7 @@ THE OTHER HALF OF CHANGE IMPACT: one row per place a type is NAMED, with the con **Notes** -- **all** — JAVA AND TYPESCRIPT. Declared in every bundle and EMPTY for Python and JavaScript, so the schema does not churn as the remaining front ends land (#663). +- **all** — JAVA AND TYPESCRIPT. Declared in every bundle and EMPTY for Python, JavaScript and C#, so the schema does not churn as the remaining front ends land (#663). - **typescript** — The context set is TypeScript's own and is wider than Java's: AS_TARGET, SATISFIES_TARGET, TYPE_ALIAS_RHS, the CONDITIONAL_* family, MAPPED_*, INDEX_SIGNATURE_* and TEMPLATE_SPAN have no Java counterpart. A use inside a conditional type IS a use of that type and is recorded as one. - **typescript** — Only a reference whose KIND can name a declaration is a row: TYPE_REFERENCE and IMPORT_TYPE. ARRAY, UNION, TUPLE and PARENTHESIZED are structure whose CHILDREN are the named references; PRIMITIVE, LITERAL, TYPE_VARIABLE, MAPPED, CONDITIONAL, INDEXED_ACCESS and INTRINSIC name nothing declared. - **java** — EVERY DEPTH is here, unlike the receiver-typing relations the engine uses internally, which filter to depth 0. A field of type `Map` produces three rows. Filter on `depth = 0` when you want the type an expression has rather than every type its declaration mentions. diff --git a/graph/bundle/schema.ts b/graph/bundle/schema.ts index 9548c716d..cd7b1e189 100644 --- a/graph/bundle/schema.ts +++ b/graph/bundle/schema.ts @@ -747,21 +747,21 @@ export const NOTES: readonly NoteSpec[] = [ { language: 'python', table: 'call_edges', note: 'A `boundary_lib` edge may point at a builtin (callee_provenance builtin, callee_label `builtin:NAME`) or at an unstaged import path (callee_provenance external) — neither has a methods row.' }, { language: 'java', table: 'call_edges', note: 'A `boundary_lib` edge with callee_provenance external names a method of an ancestor type no staged IR declares (callee_label `external:.`, no methods row). A site whose receiver is declared as such a type is multi_inferred even with one client override: the platform method itself, and the platform\'s own subclasses, are the other possible targets. Stage the library to replace the label with the real method.' }, { language: 'python', table: 'call_edges', note: 'The reason a site is ambiguous_unknown is exported per site in ext_call_site_unresolved (site, caller, reason, detail).' }, - { language: 'python', table: 'entry_points', note: 'EMPTY. The Python rule set does not derive entry points; entry_reachable is therefore empty too.' }, + { language: 'python', table: 'entry_points', note: 'Framework entry points only: url, http, orm_hook, task, signal_receiver, fixture, di_provider and grpc_service. There is no test and no main reason: a pytest test is recognised by the query layer from its file and name, not here.' }, { language: 'python', table: 'overrides', note: 'EMPTY — this table is Java-shaped. The Python dispatch envelope is in dispatch_candidates with basis `mro`, and `value` for a function assigned onto an instance\'s member; the raw linearisation is in ext_mro_position.' }, { language: 'python', table: 'type_instantiated', note: 'Every row has how = `new`: the rule set records that some client call constructs the class, not which form.' }, { language: 'all', table: 'call_edges', note: 'THE TRUST LINE, and it is not the same set of tiers in every language. RESOLVED (callee_method_id is set): known_edge and multi_inferred in every language, and boundary_lib where the library is staged (--library) — without it boundary_lib names the target in callee_label and leaves callee_method_id NULL; ALSO ambient_terminal in TypeScript, fan_capped in Java and C# (the declared base, the fan refused), and runtime_observed in C#. HANDED OVER (callee set, but the site passes the function rather than calling it): callback_registered and event_dispatch in JavaScript; event_dispatch in C# too, where a mediator Send or Publish runs the handler for the request type, beside the row for the site itself. CORRECT END (callee NULL, and nothing is missing): intrinsic_terminal in TypeScript; ambient_terminal, implicit_constructor and dynamic_terminal in JavaScript; known_implicit_ctor, known_builtin_operator and boundary_generated (callee_label set) in C#. BLIND SPOT (callee NULL; exactly the tiers named `ambiguous_*`, which are what unresolved_sites holds): ambiguous_unknown everywhere, ALSO ambiguous_anon in Java and ambiguous_dynamic in C#. CAPPED (callee NULL, not in unresolved_sites): fan_capped in JavaScript. Python emits only the four shared tiers. A filter written as `tier IN (known_edge, multi_inferred)` therefore drops resolved edges in every language but Python — derive the set from this note or from unresolved_sites, never from a hardcoded list.' }, { language: 'java', table: 'call_edges', note: 'A multi_inferred fan is CHA-wide: it is every override the hierarchy admits, bounded only by the dispatch cap. type_instantiated is computed and exported but NOT read by any rule, so the fan is not narrowed to types the program constructs. Narrow it yourself by joining dispatch_candidates to type_instantiated — see the dispatch_envelope_of query. A receiver is ALSO typed by what flows into it (a local\'s initializer, the arguments callers pass to a parameter, the receivers callers invoke a method on for its `this`), and each flow-in type resolves its member directly, outside the fan: that is why a `fan_capped` site still carries edges, and why they are the types the program was seen to hand over, not the whole hierarchy.' }, { language: 'typescript', table: 'call_edges', note: 'A multi_inferred fan is CHA-wide, as in Java: type_instantiated is computed and exported but NOT read by any rule. The fan also has sources that are not virtual dispatch at all — an overload set or a union-typed receiver produces one too.' }, { language: 'python', table: 'call_edges', note: 'A multi_inferred fan IS narrowed by the instantiation set: type_instantiated_reachable (the constructed classes and their bases) bounds dispatch in resolution/dispatch.dl. Python is the only front end where that narrowing is applied, so a fan here is tighter than the same shape would be in Java or TypeScript.' }, - { language: 'all', table: 'type_use', note: 'JAVA AND TYPESCRIPT. Declared in every bundle and EMPTY for Python and JavaScript, so the schema does not churn as the remaining front ends land (#663).' }, + { language: 'all', table: 'type_use', note: 'JAVA AND TYPESCRIPT. Declared in every bundle and EMPTY for Python, JavaScript and C#, so the schema does not churn as the remaining front ends land (#663).' }, { language: 'typescript', table: 'type_use', note: 'The context set is TypeScript\'s own and is wider than Java\'s: AS_TARGET, SATISFIES_TARGET, TYPE_ALIAS_RHS, the CONDITIONAL_* family, MAPPED_*, INDEX_SIGNATURE_* and TEMPLATE_SPAN have no Java counterpart. A use inside a conditional type IS a use of that type and is recorded as one.' }, { language: 'typescript', table: 'type_use', note: 'Only a reference whose KIND can name a declaration is a row: TYPE_REFERENCE and IMPORT_TYPE. ARRAY, UNION, TUPLE and PARENTHESIZED are structure whose CHILDREN are the named references; PRIMITIVE, LITERAL, TYPE_VARIABLE, MAPPED, CONDITIONAL, INDEXED_ACCESS and INTRINSIC name nothing declared.' }, { language: 'java', table: 'type_use', note: 'EVERY DEPTH is here, unlike the receiver-typing relations the engine uses internally, which filter to depth 0. A field of type `Map` produces three rows. Filter on `depth = 0` when you want the type an expression has rather than every type its declaration mentions.' }, { language: 'java', table: 'type_use', note: 'A TYPE_VARIABLE reference (`T`, `E`) is not a row: it names the declaration\'s own parameter, not a type. Where the parameter has a written bound the USE resolves to that bound and IS a row, so ` void f(T t)` records a use of Node.' }, { language: 'java', table: 'type_use', note: 'The reference rows carry no line in the Java IR (every all-type-references row has an empty startLine), so this table has no position columns. Use owner_method_id, or owner_type_id plus the types row, to locate a use.' }, { language: 'all', table: 'field_access', note: 'JAVA AND TYPESCRIPT. The table is declared in every bundle and is EMPTY for Python, JavaScript and C# (C# fills `fields`, not `field_access`), so the schema does not churn as the remaining front ends land (#663). Check `SELECT count(*) FROM field_access` before reading an empty result as "nothing reads this field".' }, - { language: 'all', table: 'fields', note: 'JAVA AND TYPESCRIPT, for the same reason as field_access: declared everywhere, populated by those two front ends.' }, + { language: 'all', table: 'fields', note: 'JAVA, TYPESCRIPT AND C#. EMPTY for Python and JavaScript: a Python attribute is a symbols row of kind field. In C# it holds true fields only; a property is a symbols row of kind field with a property id, and its accessors are methods rows (PROPERTY_GET, PROPERTY_SET, PROPERTY_INIT).' }, { language: 'typescript', table: 'field_access', note: 'AN ACCESSOR IS NOT HERE. `get url()` read as `c.url` is a CALL, and call_edges already carries it with kind PROPERTY_READ or PROPERTY_WRITE (#703). The two tables are disjoint by construction: this one holds properties, call_edges holds accessors. Ask both when you want every read of a member.' }, { language: 'typescript', table: 'field_access', note: 'AN ELEMENT ACCESS IS NOT HERE either: `obj["x"]` with a literal key is a different node kind and is not yet a site. A known gap, not a silent one.' }, { language: 'typescript', table: 'field_access', note: 'A METHOD IS NOT A SITE. The callee of `obj.m()` is a PROPERTY_ACCESS node (37% of them, measured on one TypeScript library), and `const f = obj.m` reads a method as a value; neither is a data edge, and admitting them would fill the ambiguous_unknown tier with sites the engine HAS resolved elsewhere. Both are excluded and counted in ext_field_site_excluded with reasons method_callee and method_value.' }, diff --git a/parser/src/parsers/python/extractors/python-field-extractor.ts b/parser/src/parsers/python/extractors/python-field-extractor.ts index ef4374779..08b87a908 100644 --- a/parser/src/parsers/python/extractors/python-field-extractor.ts +++ b/parser/src/parsers/python/extractors/python-field-extractor.ts @@ -83,6 +83,11 @@ interface WriteObservation { */ writtenBuiltinType: string; origin: PythonFieldOrigin; + /** + * 1-based, like every other Python relation. tree-sitter rows are 0-based, so + * each site adds 1; without it every field sat one line above its write, and a + * nested class's first field landed on the `class Meta:` line itself. + */ line: number; endLine: number; methodHash: string; @@ -416,8 +421,8 @@ export class PythonFieldExtractor { collection.observations.push({ name, origin, - line: target.startPosition.row, - endLine: assignment.endPosition.row, + line: target.startPosition.row + 1, + endLine: assignment.endPosition.row + 1, methodHash: '', methodName: '', receiverName: '', @@ -448,8 +453,8 @@ export class PythonFieldExtractor { collection.observations.push({ name: this.mangle(collection.typeName, literal), origin: PythonFieldOrigin.SLOTS_ENTRY, - line: node.startPosition.row, - endLine: node.endPosition.row, + line: node.startPosition.row + 1, + endLine: node.endPosition.row + 1, methodHash: '', methodName: '', receiverName: '', @@ -728,8 +733,8 @@ export class PythonFieldExtractor { collection.observations.push({ name: this.mangle(collection.typeName, literal), origin: PythonFieldOrigin.SETATTR_DYNAMIC, - line: call.startPosition.row, - endLine: call.endPosition.row, + line: call.startPosition.row + 1, + endLine: call.endPosition.row + 1, methodHash, methodName, receiverName, @@ -764,8 +769,8 @@ export class PythonFieldExtractor { collection.observations.push({ name: this.mangle(collection.typeName, nameOverride || attributeName!.text), origin, - line: target.startPosition.row, - endLine: statement.endPosition.row, + line: target.startPosition.row + 1, + endLine: statement.endPosition.row + 1, methodHash, methodName, receiverName, diff --git a/parser/src/test-data/python/verified/_golden/fields.golden b/parser/src/test-data/python/verified/_golden/fields.golden index 6f1d24d56..d5cb2e89c 100644 --- a/parser/src/test-data/python/verified/_golden/fields.golden +++ b/parser/src/test-data/python/verified/_golden/fields.golden @@ -1,49 +1,49 @@ -name=GREEN fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=30 endLine=30 pyTypeLinkHash=PY_TYPE_9e523515e44d6cfd9bc7abbd870a39fc ownerTypeName=Colour ownerQualifiedName=class_forms.Colour fieldAccess=PUBLIC_ACCESS fieldModifier=CLASS_VAR,ENUM_MEMBER,READ_ONLY fieldOrigin=ENUM_MEMBER declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=30 hasAnnotation=false annotationIsString=false initializerText=2 initializerKind=LITERAL pyModuleLinkHash=PY_MODULE_512fa5aa67cc77834aa18c596c931e59 bindingLinkHash=PY_BINDING_57ddbcd9c75cb175fbf6a58f0413624c pyExpressionLinkHash=PY_EXPRESSION_6b100833fc3d59ad93d115d8db3d7889 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_354cf9941bff4d01e1a412286829e26f -name=KIND fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=5 endLine=5 pyTypeLinkHash=PY_TYPE_bf6354f36ebb9ff7d338d07707f4d6c9 ownerTypeName=Builder ownerQualifiedName=core.factory.Builder fieldAccess=PUBLIC_ACCESS fieldModifier=CLASS_VAR,READ_ONLY fieldOrigin=CLASS_BODY_ASSIGN declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=5 hasAnnotation=false annotationIsString=false initializerText="""builder""" initializerKind=LITERAL pyModuleLinkHash=PY_MODULE_7908beb43f8c739558eabfcf93ebca84 bindingLinkHash=PY_BINDING_8f17cce2244c83d9f0b22c927181e57c pyExpressionLinkHash=PY_EXPRESSION_6b2dc1f944007de6dc6ad962a10c4d68 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_da9d8e5a0a6fb23461a6d67eebf0b406 -name=RED fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=29 endLine=29 pyTypeLinkHash=PY_TYPE_9e523515e44d6cfd9bc7abbd870a39fc ownerTypeName=Colour ownerQualifiedName=class_forms.Colour fieldAccess=PUBLIC_ACCESS fieldModifier=CLASS_VAR,ENUM_MEMBER,READ_ONLY fieldOrigin=ENUM_MEMBER declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=29 hasAnnotation=false annotationIsString=false initializerText=1 initializerKind=LITERAL pyModuleLinkHash=PY_MODULE_512fa5aa67cc77834aa18c596c931e59 bindingLinkHash=PY_BINDING_788efc874ee5c9fe8de3cf8d313ccb08 pyExpressionLinkHash=PY_EXPRESSION_08330318b58d2f5435334c19e44e1bad serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_b63b80d192db3ec3d30504b33ab5a7d5 -name=_Inner__secret fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=26 endLine=26 pyTypeLinkHash=PY_TYPE_e0b00a82da98016f61db58a6de64ca3a ownerTypeName=Inner ownerQualifiedName=name_mangling_edge_cases.Outer.Inner fieldAccess=PRIVATE_ACCESS fieldModifier=CLASS_VAR,READ_ONLY fieldOrigin=CLASS_BODY_ASSIGN declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=26 hasAnnotation=false annotationIsString=false initializerText="""inner secret""" initializerKind=LITERAL pyModuleLinkHash=PY_MODULE_75dd800d24b53dd3ca1d826ca1525876 bindingLinkHash=PY_BINDING_5f168c8d5c239011cb96ae52de48a359 pyExpressionLinkHash=PY_EXPRESSION_8d9a61772e886da7597f48f8d04adb1a serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_2ee87edc1495cf4099a701d55e5e6c46 -name=_Outer__secret fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=23 endLine=23 pyTypeLinkHash=PY_TYPE_fd26c3cd94bd9663ee01dd2cfe94159d ownerTypeName=Outer ownerQualifiedName=name_mangling_edge_cases.Outer fieldAccess=PRIVATE_ACCESS fieldModifier=CLASS_VAR,READ_ONLY fieldOrigin=CLASS_BODY_ASSIGN declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=23 hasAnnotation=false annotationIsString=false initializerText="""outer secret""" initializerKind=LITERAL pyModuleLinkHash=PY_MODULE_75dd800d24b53dd3ca1d826ca1525876 bindingLinkHash=PY_BINDING_49c59ee9461329034a85a0296cef5067 pyExpressionLinkHash=PY_EXPRESSION_37ac9136831ba123510a02a1f4e8a855 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_f2cd30b8381aef7fb269f0afaa8e87df -name=_v fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=23 endLine=23 pyTypeLinkHash=PY_TYPE_a1bd5124fede6d4f3504a0dd00092899 ownerTypeName=Kinds ownerQualifiedName=method_kinds.Kinds fieldAccess=PROTECTED_ACCESS fieldModifier=INSTANCE_VAR,READ_ONLY fieldOrigin=SELF_ASSIGN declaringMethodLinkHash=PY_METHOD_43ebe179bc6f5e46ee12ceb6ef8f8371 receiverName=self isDeclaredInInit=false writeCount=1 writtenInMethodCount=1 firstWriteLine=23 hasAnnotation=false annotationIsString=false initializerText=value initializerKind=NAME pyModuleLinkHash=PY_MODULE_7f80b0a69e6ccd5fc2e3932cc9e5dc10 bindingLinkHash= pyExpressionLinkHash=PY_EXPRESSION_6c7b177707416257783b9ec57e0e0db7 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_dcf0d30e2575c32c0165dde58ab421cd -name=a fieldTypeName=int fieldBaseType=int potentialQualifiedName=field_origins.Named.a isAmbiguous=false startLine=26 endLine=26 pyTypeLinkHash=PY_TYPE_57e2471ba226031232617e9a2c039483 ownerTypeName=Named ownerQualifiedName=field_origins.Named fieldAccess=PUBLIC_ACCESS fieldModifier=CLASS_VAR,READ_ONLY fieldOrigin=NAMEDTUPLE_FIELD declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=26 hasAnnotation=true annotationIsString=false initializerText= initializerKind=NONE pyModuleLinkHash=PY_MODULE_d9b6cd4b9890511117f0581289c3e72e bindingLinkHash=PY_BINDING_9e2b1a44d2cdbd153e83899e6455543a pyExpressionLinkHash=PY_EXPRESSION_655c42272094ed05fdc74a8ceca41e9a serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_f5cf13ceb805ace0621794c47b0edd1c -name=amount fieldTypeName=int fieldBaseType=int potentialQualifiedName=service_layer.Record.amount isAmbiguous=false startLine=8 endLine=8 pyTypeLinkHash=PY_TYPE_8ffa51c20183b9069bc165293685e3fe ownerTypeName=Record ownerQualifiedName=service_layer.Record fieldAccess=PUBLIC_ACCESS fieldModifier=CLASS_VAR,DATACLASS_FIELD,READ_ONLY fieldOrigin=DATACLASS_FIELD declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=8 hasAnnotation=true annotationIsString=false initializerText= initializerKind=NONE pyModuleLinkHash=PY_MODULE_87ff823ca7cda9220c2fe03210807591 bindingLinkHash=PY_BINDING_57bc7c03bfbb607dd13cde9fc0c4fa82 pyExpressionLinkHash=PY_EXPRESSION_0e91a6686acdabf7ba17b29df0ed45ef serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_1b8b80b6ac20cbea90df5020685db27e -name=args fieldTypeName=tuple fieldBaseType=tuple potentialQualifiedName=match_nested_patterns_and_guards.Command.args isAmbiguous=false startLine=17 endLine=17 pyTypeLinkHash=PY_TYPE_0d090a4533bb97a6729a4b05d91e8042 ownerTypeName=Command ownerQualifiedName=match_nested_patterns_and_guards.Command fieldAccess=PUBLIC_ACCESS fieldModifier=CLASS_VAR,DATACLASS_FIELD,READ_ONLY fieldOrigin=DATACLASS_FIELD declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=17 hasAnnotation=true annotationIsString=false initializerText= initializerKind=NONE pyModuleLinkHash=PY_MODULE_fcb43aba22913355ac115ae9c4556240 bindingLinkHash=PY_BINDING_9a435ed4c1ece9c11135dbd0160b4df5 pyExpressionLinkHash=PY_EXPRESSION_0ee6d1d4f1d073dd98461650dcad5106 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_3957058ce75e0648a430fbe98178267e -name=attribute fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=13 endLine=13 pyTypeLinkHash=PY_TYPE_ba2fbe8e09ca96c2ac317281255eb0d6 ownerTypeName=Documented ownerQualifiedName=comment_forms.Documented fieldAccess=PUBLIC_ACCESS fieldModifier=CLASS_VAR,READ_ONLY fieldOrigin=CLASS_BODY_ASSIGN declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=13 hasAnnotation=false annotationIsString=false initializerText=1 initializerKind=LITERAL pyModuleLinkHash=PY_MODULE_898ba18a31075a2ba7818f72c287b8d1 bindingLinkHash=PY_BINDING_2424a859b65550cd9888982deae03d22 pyExpressionLinkHash=PY_EXPRESSION_ffabf59979fb14780a4b3608e603c0d1 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_385e7b366a08ca3716f29841e22cc22f -name=b fieldTypeName=str fieldBaseType=str potentialQualifiedName=field_origins.Named.b isAmbiguous=false startLine=27 endLine=27 pyTypeLinkHash=PY_TYPE_57e2471ba226031232617e9a2c039483 ownerTypeName=Named ownerQualifiedName=field_origins.Named fieldAccess=PUBLIC_ACCESS fieldModifier=CLASS_VAR,READ_ONLY fieldOrigin=NAMEDTUPLE_FIELD declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=27 hasAnnotation=true annotationIsString=false initializerText= initializerKind=NONE pyModuleLinkHash=PY_MODULE_d9b6cd4b9890511117f0581289c3e72e bindingLinkHash=PY_BINDING_9557301ac4f28d860f8ea85d7d5f12c3 pyExpressionLinkHash=PY_EXPRESSION_3ef8970040c01d72c72ad800129733ee serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_310894d9c629bedb0d3af75ed37d2926 -name=children fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=6 endLine=6 pyTypeLinkHash=PY_TYPE_114cb72d42012abcb4ffcbce3bc6a345 ownerTypeName=Node ownerQualifiedName=core.base.Node fieldAccess=PUBLIC_ACCESS fieldModifier=INSTANCE_VAR,READ_ONLY fieldOrigin=SELF_ASSIGN declaringMethodLinkHash=PY_METHOD_1800af667e7076b626bd654b5e3dbebd receiverName=self isDeclaredInInit=true writeCount=1 writtenInMethodCount=1 firstWriteLine=6 hasAnnotation=false annotationIsString=false initializerText=[] initializerKind=LITERAL pyModuleLinkHash=PY_MODULE_0af7a9df251376bafe876afe4a32f46e bindingLinkHash= pyExpressionLinkHash=PY_EXPRESSION_2b5c5d4e2ede82425c6cc08afb31af7e serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_379b43102358abde65f30ca1de0bcd84 -name=class_body_annotation fieldTypeName=int fieldBaseType=int potentialQualifiedName=field_origins.Origins.class_body_annotation isAmbiguous=false startLine=7 endLine=7 pyTypeLinkHash=PY_TYPE_8e5e7ae02d7e897e2dae13f4d1fc41bc ownerTypeName=Origins ownerQualifiedName=field_origins.Origins fieldAccess=PUBLIC_ACCESS fieldModifier=CLASS_VAR,READ_ONLY fieldOrigin=CLASS_BODY_ANNOTATION_ONLY declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=7 hasAnnotation=true annotationIsString=false initializerText= initializerKind=NONE pyModuleLinkHash=PY_MODULE_d9b6cd4b9890511117f0581289c3e72e bindingLinkHash=PY_BINDING_b06aa81bc5c9cd99d90ba02007b150fe pyExpressionLinkHash=PY_EXPRESSION_545963f8035cf0bdb65e61c5d4e613c6 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_95475ba063df3c93c21f1c308805edd9 -name=class_body_assign fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=6 endLine=6 pyTypeLinkHash=PY_TYPE_8e5e7ae02d7e897e2dae13f4d1fc41bc ownerTypeName=Origins ownerQualifiedName=field_origins.Origins fieldAccess=PUBLIC_ACCESS fieldModifier=CLASS_VAR,READ_ONLY fieldOrigin=CLASS_BODY_ASSIGN declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=6 hasAnnotation=false annotationIsString=false initializerText=1 initializerKind=LITERAL pyModuleLinkHash=PY_MODULE_d9b6cd4b9890511117f0581289c3e72e bindingLinkHash=PY_BINDING_1d3d16a7ecf67dc4f185bb6856b55ce1 pyExpressionLinkHash=PY_EXPRESSION_4c58afc15bc350db5af24aafaf24281c serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_56d654562f909d6501f78a7efbec6215 -name=class_var fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=52 endLine=52 pyTypeLinkHash=PY_TYPE_e61b2b74f7302f1be447bd28221d2310 ownerTypeName=ClassScope ownerQualifiedName=scope_forms.ClassScope fieldAccess=PUBLIC_ACCESS fieldModifier=CLASS_VAR,READ_ONLY fieldOrigin=CLASS_BODY_ASSIGN declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=52 hasAnnotation=false annotationIsString=false initializerText=1 initializerKind=LITERAL pyModuleLinkHash=PY_MODULE_f56326f63a4c5bef9294b28a4acb9abc bindingLinkHash=PY_BINDING_4bcd55d471aae0bad8d158832c4e4dca pyExpressionLinkHash=PY_EXPRESSION_6068c5654402f0188994f976ddff8750 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_395310756cb1d1d83c7b698fea57e4dc -name=count fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=66 endLine=66 pyTypeLinkHash=PY_TYPE_35883ba9ad396e2203b42abef9e1d7c9 ownerTypeName=Chained ownerQualifiedName=resolution_edges.Chained fieldAccess=PUBLIC_ACCESS fieldModifier=INSTANCE_VAR,READ_ONLY fieldOrigin=SELF_ASSIGN declaringMethodLinkHash=PY_METHOD_994dce81c215c9114b56d78e93cdf732 receiverName=self isDeclaredInInit=true writeCount=1 writtenInMethodCount=1 firstWriteLine=66 hasAnnotation=false annotationIsString=false initializerText=0 initializerKind=LITERAL pyModuleLinkHash=PY_MODULE_daef721b73c8bfbcc0348299f2f7bf9a bindingLinkHash= pyExpressionLinkHash=PY_EXPRESSION_7b0cae40fc8c704752083b3ee0fceb16 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_21ead56058d3d069ccf562ee8f4901d4 -name=count fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=69 endLine=69 pyTypeLinkHash=PY_TYPE_35883ba9ad396e2203b42abef9e1d7c9 ownerTypeName=Chained ownerQualifiedName=resolution_edges.Chained fieldAccess=PUBLIC_ACCESS fieldModifier=INSTANCE_VAR fieldOrigin=SELF_AUGASSIGN declaringMethodLinkHash=PY_METHOD_b561ec322633cc1dd8bcac47c5b8c82b receiverName=self isDeclaredInInit=false writeCount=1 writtenInMethodCount=1 firstWriteLine=69 hasAnnotation=false annotationIsString=false initializerText= initializerKind=NONE pyModuleLinkHash=PY_MODULE_daef721b73c8bfbcc0348299f2f7bf9a bindingLinkHash= pyExpressionLinkHash=PY_EXPRESSION_76e084392d2dd97ca35228a147447c5e serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_cbc349dfa7dba6a7f967589d4623516d -name=data fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=22 endLine=22 pyTypeLinkHash=PY_TYPE_b4aa287abde8dbb60cac1736e458094f ownerTypeName=ClassScopeIsInvisibleToComprehensions ownerQualifiedName=scoping_edge_cases.ClassScopeIsInvisibleToComprehensions fieldAccess=PUBLIC_ACCESS fieldModifier=CLASS_VAR,READ_ONLY fieldOrigin=CLASS_BODY_ASSIGN declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=22 hasAnnotation=false annotationIsString=false initializerText=[1, 2, 3] initializerKind=LITERAL pyModuleLinkHash=PY_MODULE_7c5670e72548f0c21d5e8710e5a91903 bindingLinkHash=PY_BINDING_2979d1fb44aef0644d73caeef4e16875 pyExpressionLinkHash=PY_EXPRESSION_9d502d9e8053c97698b1fd82a5f1ef02 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_bebc562b5a7574ce8ac9e36ada3ef18c -name=doubled fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=27 endLine=27 pyTypeLinkHash=PY_TYPE_b4aa287abde8dbb60cac1736e458094f ownerTypeName=ClassScopeIsInvisibleToComprehensions ownerQualifiedName=scoping_edge_cases.ClassScopeIsInvisibleToComprehensions fieldAccess=PUBLIC_ACCESS fieldModifier=CLASS_VAR,READ_ONLY fieldOrigin=CLASS_BODY_ASSIGN declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=27 hasAnnotation=false annotationIsString=false initializerText=[item * 2 for item in data] initializerKind=COMPREHENSION pyModuleLinkHash=PY_MODULE_7c5670e72548f0c21d5e8710e5a91903 bindingLinkHash=PY_BINDING_463a0938fe7b9c7d0b98f8a91a5fa9b1 pyExpressionLinkHash=PY_EXPRESSION_7a1c506cbc933dcebc9cff34cfeb9098 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_f84a1f38e2ec605e0f7371d09882a819 -name=key fieldTypeName=int fieldBaseType=int potentialQualifiedName=field_origins.Typed.key isAmbiguous=false startLine=31 endLine=31 pyTypeLinkHash=PY_TYPE_ab0f66955e01d63bfcdb185cba8220c9 ownerTypeName=Typed ownerQualifiedName=field_origins.Typed fieldAccess=PUBLIC_ACCESS fieldModifier=CLASS_VAR,READ_ONLY fieldOrigin=TYPEDDICT_KEY declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=31 hasAnnotation=true annotationIsString=false initializerText= initializerKind=NONE pyModuleLinkHash=PY_MODULE_d9b6cd4b9890511117f0581289c3e72e bindingLinkHash=PY_BINDING_e2bb803db7c6d1eb22f6564f99c728a6 pyExpressionLinkHash=PY_EXPRESSION_cf8c36787653df27e29b2e8d273a91a4 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_cfe099bdbc0b4a62a3d6135ca67cf7c0 -name=key fieldTypeName=str fieldBaseType=str potentialQualifiedName=service_layer.Record.key isAmbiguous=false startLine=7 endLine=7 pyTypeLinkHash=PY_TYPE_8ffa51c20183b9069bc165293685e3fe ownerTypeName=Record ownerQualifiedName=service_layer.Record fieldAccess=PUBLIC_ACCESS fieldModifier=CLASS_VAR,DATACLASS_FIELD,READ_ONLY fieldOrigin=DATACLASS_FIELD declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=7 hasAnnotation=true annotationIsString=false initializerText= initializerKind=NONE pyModuleLinkHash=PY_MODULE_87ff823ca7cda9220c2fe03210807591 bindingLinkHash=PY_BINDING_8c140f9ae98b25bc5c0a4168c96dc0dc pyExpressionLinkHash=PY_EXPRESSION_02ca24b3af6950ca1b62257fad48588b serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_27261db33e56b96f29132dfaa71d3f4e -name=kind fieldTypeName=str fieldBaseType=str potentialQualifiedName=match_nested_patterns_and_guards.Event.kind isAmbiguous=false startLine=10 endLine=10 pyTypeLinkHash=PY_TYPE_2ce58f5e8c9675c1e0fd5c50ffba85b9 ownerTypeName=Event ownerQualifiedName=match_nested_patterns_and_guards.Event fieldAccess=PUBLIC_ACCESS fieldModifier=CLASS_VAR,DATACLASS_FIELD,READ_ONLY fieldOrigin=DATACLASS_FIELD declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=10 hasAnnotation=true annotationIsString=false initializerText= initializerKind=NONE pyModuleLinkHash=PY_MODULE_fcb43aba22913355ac115ae9c4556240 bindingLinkHash=PY_BINDING_a71edea3725a72a19e6afe34df82df70 pyExpressionLinkHash=PY_EXPRESSION_24ae5eca16a253b79944f8cf60d1f4cc serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_adf2e9134c1d3b66aedefcfe1ecbe569 -name=label fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=40 endLine=40 pyTypeLinkHash=PY_TYPE_cb9da9964bc3c43761a4e1269506effe ownerTypeName=ClassScopeIsInvisibleToMethods ownerQualifiedName=scoping_edge_cases.ClassScopeIsInvisibleToMethods fieldAccess=PUBLIC_ACCESS fieldModifier=CLASS_VAR,READ_ONLY fieldOrigin=CLASS_BODY_ASSIGN declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=40 hasAnnotation=false annotationIsString=false initializerText="""class attribute""" initializerKind=LITERAL pyModuleLinkHash=PY_MODULE_7c5670e72548f0c21d5e8710e5a91903 bindingLinkHash=PY_BINDING_98ec45593e2cb658d620508b81299faa pyExpressionLinkHash=PY_EXPRESSION_42fe92a294647ed36376fb8eb05bcab7 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_f1fd14ac02e06017fd967c9e6fed6fb3 -name=n fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=5 endLine=5 pyTypeLinkHash=PY_TYPE_b2f97d5a7e48f40b008fc644ae603fdf ownerTypeName=Holder ownerQualifiedName=expression_kinds.Holder fieldAccess=PUBLIC_ACCESS fieldModifier=INSTANCE_VAR,READ_ONLY fieldOrigin=SELF_ASSIGN declaringMethodLinkHash=PY_METHOD_9949f650301345b4e4deaca03bd84aa2 receiverName=self isDeclaredInInit=true writeCount=1 writtenInMethodCount=1 firstWriteLine=5 hasAnnotation=false annotationIsString=false initializerText=n initializerKind=NAME pyModuleLinkHash=PY_MODULE_02d561b0acde0974e99e75b89b4bdab0 bindingLinkHash= pyExpressionLinkHash=PY_EXPRESSION_8d749d70dcd6b628deac2048e53d55e0 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_9df925d8945d2bf31f49db8111a0dc69 -name=name fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=17 endLine=17 pyTypeLinkHash=PY_TYPE_bf6354f36ebb9ff7d338d07707f4d6c9 ownerTypeName=Builder ownerQualifiedName=core.factory.Builder fieldAccess=PUBLIC_ACCESS fieldModifier=INSTANCE_VAR,READ_ONLY fieldOrigin=SELF_ASSIGN declaringMethodLinkHash=PY_METHOD_bd7c847866b0674467ec65fee212e98d receiverName=self isDeclaredInInit=true writeCount=1 writtenInMethodCount=1 firstWriteLine=17 hasAnnotation=false annotationIsString=false initializerText=name initializerKind=NAME pyModuleLinkHash=PY_MODULE_7908beb43f8c739558eabfcf93ebca84 bindingLinkHash= pyExpressionLinkHash=PY_EXPRESSION_585104a79ffa32b57b756846339f5739 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_e099ac70f91cfbdc5ff7c13e73233075 -name=name fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=5 endLine=5 pyTypeLinkHash=PY_TYPE_114cb72d42012abcb4ffcbce3bc6a345 ownerTypeName=Node ownerQualifiedName=core.base.Node fieldAccess=PUBLIC_ACCESS fieldModifier=INSTANCE_VAR,READ_ONLY fieldOrigin=SELF_ASSIGN declaringMethodLinkHash=PY_METHOD_1800af667e7076b626bd654b5e3dbebd receiverName=self isDeclaredInInit=true writeCount=1 writtenInMethodCount=1 firstWriteLine=5 hasAnnotation=false annotationIsString=false initializerText=name initializerKind=NAME pyModuleLinkHash=PY_MODULE_0af7a9df251376bafe876afe4a32f46e bindingLinkHash= pyExpressionLinkHash=PY_EXPRESSION_105c90e8c0edac7578788345181e8b7f serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_4892cbb3eae7d00e22619a4bee9e4477 -name=name fieldTypeName=str fieldBaseType=str potentialQualifiedName=match_nested_patterns_and_guards.Command.name isAmbiguous=false startLine=16 endLine=16 pyTypeLinkHash=PY_TYPE_0d090a4533bb97a6729a4b05d91e8042 ownerTypeName=Command ownerQualifiedName=match_nested_patterns_and_guards.Command fieldAccess=PUBLIC_ACCESS fieldModifier=CLASS_VAR,DATACLASS_FIELD,READ_ONLY fieldOrigin=DATACLASS_FIELD declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=16 hasAnnotation=true annotationIsString=false initializerText= initializerKind=NONE pyModuleLinkHash=PY_MODULE_fcb43aba22913355ac115ae9c4556240 bindingLinkHash=PY_BINDING_cd0d311bf325ef8c8ae6238a63dcad6f pyExpressionLinkHash=PY_EXPRESSION_eac151d5d6927868317023b3e1775a9d serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_bdf77c8fc8ad7a8203a0dbfdd9def840 -name=node fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=18 endLine=18 pyTypeLinkHash=PY_TYPE_bf6354f36ebb9ff7d338d07707f4d6c9 ownerTypeName=Builder ownerQualifiedName=core.factory.Builder fieldAccess=PUBLIC_ACCESS fieldModifier=INSTANCE_VAR,READ_ONLY fieldOrigin=SELF_ASSIGN declaringMethodLinkHash=PY_METHOD_bd7c847866b0674467ec65fee212e98d receiverName=self isDeclaredInInit=true writeCount=1 writtenInMethodCount=1 firstWriteLine=18 hasAnnotation=false annotationIsString=false initializerText=Node(name) initializerKind=CALL pyModuleLinkHash=PY_MODULE_7908beb43f8c739558eabfcf93ebca84 bindingLinkHash= pyExpressionLinkHash=PY_EXPRESSION_e901fe2384634e118a14e9746dc8d29a serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_49ef51dcaf6157efde16ddf34306974e -name=nodes fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=27 endLine=27 pyTypeLinkHash=PY_TYPE_f511a7eca38906948dce8170bb4e5495 ownerTypeName=Registry ownerQualifiedName=core.base.Registry fieldAccess=PUBLIC_ACCESS fieldModifier=INSTANCE_VAR,READ_ONLY fieldOrigin=SELF_ASSIGN declaringMethodLinkHash=PY_METHOD_d7a26baec95db1ac47ae906b256b56b6 receiverName=self isDeclaredInInit=true writeCount=1 writtenInMethodCount=1 firstWriteLine=27 hasAnnotation=false annotationIsString=false initializerText=[] initializerKind=LITERAL pyModuleLinkHash=PY_MODULE_0af7a9df251376bafe876afe4a32f46e bindingLinkHash= pyExpressionLinkHash=PY_EXPRESSION_37663bc3f580f7f4b5e952c3b83bbb53 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_2a7e11b6b84f1f30e344016dbc9c423d -name=payload fieldTypeName=dict fieldBaseType=dict potentialQualifiedName=match_nested_patterns_and_guards.Event.payload isAmbiguous=false startLine=11 endLine=11 pyTypeLinkHash=PY_TYPE_2ce58f5e8c9675c1e0fd5c50ffba85b9 ownerTypeName=Event ownerQualifiedName=match_nested_patterns_and_guards.Event fieldAccess=PUBLIC_ACCESS fieldModifier=CLASS_VAR,DATACLASS_FIELD,READ_ONLY fieldOrigin=DATACLASS_FIELD declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=11 hasAnnotation=true annotationIsString=false initializerText= initializerKind=NONE pyModuleLinkHash=PY_MODULE_fcb43aba22913355ac115ae9c4556240 bindingLinkHash=PY_BINDING_13c4c5fdb58a9e4c8b2de72989a22932 pyExpressionLinkHash=PY_EXPRESSION_1586dc4c0c9ec70cb3d13c84f1727e77 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_01ef6b233822f48581ac56724f516c07 -name=registered fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=35 endLine=35 pyTypeLinkHash=PY_TYPE_a1bd5124fede6d4f3504a0dd00092899 ownerTypeName=Kinds ownerQualifiedName=method_kinds.Kinds fieldAccess=PUBLIC_ACCESS fieldModifier=INSTANCE_VAR,READ_ONLY fieldOrigin=SELF_ASSIGN declaringMethodLinkHash=PY_METHOD_5c50c5642d36a230fa6b6e9f7ed1d793 receiverName=cls isDeclaredInInit=false writeCount=1 writtenInMethodCount=1 firstWriteLine=35 hasAnnotation=false annotationIsString=false initializerText=True initializerKind=LITERAL pyModuleLinkHash=PY_MODULE_7f80b0a69e6ccd5fc2e3932cc9e5dc10 bindingLinkHash= pyExpressionLinkHash=PY_EXPRESSION_770096a696c823a0acb4d74638579069 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_5eee83bd12ab74a7e50ee0ca4f615196 -name=repository fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=43 endLine=43 pyTypeLinkHash=PY_TYPE_c4ea4c823c48edb338a6cd78787cae9b ownerTypeName=Service ownerQualifiedName=service_layer.Service fieldAccess=PUBLIC_ACCESS fieldModifier=INSTANCE_VAR,READ_ONLY fieldOrigin=SELF_ASSIGN declaringMethodLinkHash=PY_METHOD_c2679ef7c7ff76fd0d905dfb8219e815 receiverName=self isDeclaredInInit=true writeCount=1 writtenInMethodCount=1 firstWriteLine=43 hasAnnotation=false annotationIsString=false initializerText=repository initializerKind=NAME pyModuleLinkHash=PY_MODULE_87ff823ca7cda9220c2fe03210807591 bindingLinkHash= pyExpressionLinkHash=PY_EXPRESSION_39117b39cc41afe8b691c23f84675db1 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_ba06c6ab6360c63d00ccbdfb193ee986 -name=rows fieldTypeName=typing.List[Record] fieldBaseType=List potentialQualifiedName=service_layer.Store.rows isAmbiguous=false startLine=16 endLine=16 pyTypeLinkHash=PY_TYPE_2cf22ea62c0a0c4b7621a04b81853658 ownerTypeName=Store ownerQualifiedName=service_layer.Store fieldAccess=PUBLIC_ACCESS fieldModifier=INSTANCE_VAR,READ_ONLY fieldOrigin=SELF_ASSIGN declaringMethodLinkHash=PY_METHOD_1b1abae80728c42e4cc6b0dbc18b5ec2 receiverName=self isDeclaredInInit=true writeCount=1 writtenInMethodCount=1 firstWriteLine=16 hasAnnotation=true annotationIsString=false initializerText=[] initializerKind=LITERAL pyModuleLinkHash=PY_MODULE_87ff823ca7cda9220c2fe03210807591 bindingLinkHash= pyExpressionLinkHash=PY_EXPRESSION_ef6124b63d25a3882170fe90d7e7aa10 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_982e6f2f24bd41d8e0dcef33a86a3a6a -name=scaled fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=36 endLine=36 pyTypeLinkHash=PY_TYPE_b4aa287abde8dbb60cac1736e458094f ownerTypeName=ClassScopeIsInvisibleToComprehensions ownerQualifiedName=scoping_edge_cases.ClassScopeIsInvisibleToComprehensions fieldAccess=PUBLIC_ACCESS fieldModifier=CLASS_VAR,READ_ONLY fieldOrigin=CLASS_BODY_ASSIGN declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=36 hasAnnotation=false annotationIsString=false initializerText=[item * data[0] for item in range(3)] initializerKind=COMPREHENSION pyModuleLinkHash=PY_MODULE_7c5670e72548f0c21d5e8710e5a91903 bindingLinkHash=PY_BINDING_b6ba5ccaaf2812fdfe59e082e4220ac8 pyExpressionLinkHash=PY_EXPRESSION_96eea804d6ac4509c9232efc3d58a9bf serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_38c6f01897875da284ae4ed20953ccf5 -name=self_assign fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=11 endLine=11 pyTypeLinkHash=PY_TYPE_8e5e7ae02d7e897e2dae13f4d1fc41bc ownerTypeName=Origins ownerQualifiedName=field_origins.Origins fieldAccess=PUBLIC_ACCESS fieldModifier=INSTANCE_VAR,READ_ONLY fieldOrigin=SELF_ASSIGN declaringMethodLinkHash=PY_METHOD_0392ee9e7a4bc56bb004a6e7afba21d3 receiverName=self isDeclaredInInit=true writeCount=1 writtenInMethodCount=1 firstWriteLine=11 hasAnnotation=false annotationIsString=false initializerText=2 initializerKind=LITERAL pyModuleLinkHash=PY_MODULE_d9b6cd4b9890511117f0581289c3e72e bindingLinkHash= pyExpressionLinkHash=PY_EXPRESSION_50aab41b2a79282580adb17ecd509bf4 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_9dd57248346cd4c94d18e3ae6a54e092 -name=self_augassign fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=12 endLine=12 pyTypeLinkHash=PY_TYPE_8e5e7ae02d7e897e2dae13f4d1fc41bc ownerTypeName=Origins ownerQualifiedName=field_origins.Origins fieldAccess=PUBLIC_ACCESS fieldModifier=INSTANCE_VAR,READ_ONLY fieldOrigin=SELF_ASSIGN declaringMethodLinkHash=PY_METHOD_0392ee9e7a4bc56bb004a6e7afba21d3 receiverName=self isDeclaredInInit=true writeCount=1 writtenInMethodCount=1 firstWriteLine=12 hasAnnotation=false annotationIsString=false initializerText=0 initializerKind=LITERAL pyModuleLinkHash=PY_MODULE_d9b6cd4b9890511117f0581289c3e72e bindingLinkHash= pyExpressionLinkHash=PY_EXPRESSION_c848ec2b334a0c0c95ecf82516738045 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_a08b36eb3272a0f66469bbe7d307dd42 -name=self_augassign fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=13 endLine=13 pyTypeLinkHash=PY_TYPE_8e5e7ae02d7e897e2dae13f4d1fc41bc ownerTypeName=Origins ownerQualifiedName=field_origins.Origins fieldAccess=PUBLIC_ACCESS fieldModifier=INSTANCE_VAR fieldOrigin=SELF_AUGASSIGN declaringMethodLinkHash=PY_METHOD_0392ee9e7a4bc56bb004a6e7afba21d3 receiverName=self isDeclaredInInit=true writeCount=1 writtenInMethodCount=1 firstWriteLine=13 hasAnnotation=false annotationIsString=false initializerText= initializerKind=NONE pyModuleLinkHash=PY_MODULE_d9b6cd4b9890511117f0581289c3e72e bindingLinkHash= pyExpressionLinkHash=PY_EXPRESSION_6e8a8a980cbdfe31ca1f70cf5768aa54 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_e63bf9a63c8f71ab184065a04e212c41 -name=slot_entry fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=8 endLine=8 pyTypeLinkHash=PY_TYPE_8e5e7ae02d7e897e2dae13f4d1fc41bc ownerTypeName=Origins ownerQualifiedName=field_origins.Origins fieldAccess=PUBLIC_ACCESS fieldModifier=SLOT,INSTANCE_VAR,READ_ONLY fieldOrigin=SLOTS_ENTRY declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=8 hasAnnotation=false annotationIsString=false initializerText= initializerKind=NONE pyModuleLinkHash=PY_MODULE_d9b6cd4b9890511117f0581289c3e72e bindingLinkHash= pyExpressionLinkHash=PY_EXPRESSION_c3dd5c9baa37a65645ba641deaf75370 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_3b691937578677fc25973ac19b74dd84 -name=store fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=27 endLine=27 pyTypeLinkHash=PY_TYPE_2dfd4389681449004ff326855f81c683 ownerTypeName=Repository ownerQualifiedName=service_layer.Repository fieldAccess=PUBLIC_ACCESS fieldModifier=INSTANCE_VAR,READ_ONLY fieldOrigin=SELF_ASSIGN declaringMethodLinkHash=PY_METHOD_e9a9fd209ad674fca757b55f0d59046a receiverName=self isDeclaredInInit=true writeCount=1 writtenInMethodCount=1 firstWriteLine=27 hasAnnotation=false annotationIsString=false initializerText=store initializerKind=NAME pyModuleLinkHash=PY_MODULE_87ff823ca7cda9220c2fe03210807591 bindingLinkHash= pyExpressionLinkHash=PY_EXPRESSION_761a7f788c9fcafe8fe54d441cd94d55 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_6de6365a260cb8ca2a2f41c13e057e22 -name=tag fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=53 endLine=53 pyTypeLinkHash=PY_TYPE_bd7d395e13e5c973a6e8538aced32fab ownerTypeName=ClassMethodFactory ownerQualifiedName=resolution_edges.ClassMethodFactory fieldAccess=PUBLIC_ACCESS fieldModifier=INSTANCE_VAR,READ_ONLY fieldOrigin=SELF_ASSIGN declaringMethodLinkHash=PY_METHOD_eb5681c8ddcf04929815457a1e598d59 receiverName=self isDeclaredInInit=true writeCount=1 writtenInMethodCount=1 firstWriteLine=53 hasAnnotation=false annotationIsString=false initializerText=tag initializerKind=NAME pyModuleLinkHash=PY_MODULE_daef721b73c8bfbcc0348299f2f7bf9a bindingLinkHash= pyExpressionLinkHash=PY_EXPRESSION_0f7fa5219483899dc1b1880a6f9d494a serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_77575b7f5a7219c8590bc9a37754d3d0 -name=values fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=36 endLine=36 pyTypeLinkHash=PY_TYPE_1e732b162f5deaead4b2e1751fdc8b5f ownerTypeName=InClassBody ownerQualifiedName=comprehension_forms.InClassBody fieldAccess=PUBLIC_ACCESS fieldModifier=CLASS_VAR,READ_ONLY fieldOrigin=CLASS_BODY_ASSIGN declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=36 hasAnnotation=false annotationIsString=false initializerText=[i for i in range(3)] initializerKind=COMPREHENSION pyModuleLinkHash=PY_MODULE_69c6710ffe12b2fc51e03f770319af1b bindingLinkHash=PY_BINDING_086207b12b3601fd4624743e01cd845a pyExpressionLinkHash=PY_EXPRESSION_5d743a1c689a266929bda307ac93ebce serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_0098386942688fc6a884e12e9f6911e3 -name=x fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=21 endLine=21 pyTypeLinkHash=PY_TYPE_834b419437b855738443676b9b3cada0 ownerTypeName=WithSlots ownerQualifiedName=class_forms.WithSlots fieldAccess=PUBLIC_ACCESS fieldModifier=SLOT,INSTANCE_VAR,READ_ONLY fieldOrigin=SLOTS_ENTRY declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=21 hasAnnotation=false annotationIsString=false initializerText= initializerKind=NONE pyModuleLinkHash=PY_MODULE_512fa5aa67cc77834aa18c596c931e59 bindingLinkHash= pyExpressionLinkHash=PY_EXPRESSION_bf49d94b1b5b1d615224bbcede193fd6 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_410e9424d9f85c7f01069a6333206741 -name=x fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=24 endLine=24 pyTypeLinkHash=PY_TYPE_834b419437b855738443676b9b3cada0 ownerTypeName=WithSlots ownerQualifiedName=class_forms.WithSlots fieldAccess=PUBLIC_ACCESS fieldModifier=INSTANCE_VAR,SLOT,READ_ONLY fieldOrigin=SELF_ASSIGN declaringMethodLinkHash=PY_METHOD_1c60534bccbeaabf71d83fbb629164fb receiverName=self isDeclaredInInit=true writeCount=1 writtenInMethodCount=1 firstWriteLine=24 hasAnnotation=false annotationIsString=false initializerText=1 initializerKind=LITERAL pyModuleLinkHash=PY_MODULE_512fa5aa67cc77834aa18c596c931e59 bindingLinkHash= pyExpressionLinkHash=PY_EXPRESSION_0862eff6ff0a1adb1f8aedc4c19d268f serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_23dc9f7e711905b8433e9f2ce8b4811e -name=x fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=9 endLine=9 pyTypeLinkHash=PY_TYPE_6f4e90e4697b76a388566c9bd84e0d4d ownerTypeName=Point ownerQualifiedName=match_class_and_sequence_patterns.Point fieldAccess=PUBLIC_ACCESS fieldModifier=INSTANCE_VAR,READ_ONLY fieldOrigin=SELF_ASSIGN declaringMethodLinkHash=PY_METHOD_ed898c7ba31b1d5a88a7ed47da6a477b receiverName=self isDeclaredInInit=true writeCount=1 writtenInMethodCount=1 firstWriteLine=9 hasAnnotation=false annotationIsString=false initializerText=x initializerKind=NAME pyModuleLinkHash=PY_MODULE_e8c22c801b9d7d33638ace57665fdd49 bindingLinkHash= pyExpressionLinkHash=PY_EXPRESSION_d8d7077f45710e9120c3e6398cc0986e serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_92a0068d85f354f19ad6d582e045d7df -name=x fieldTypeName=int fieldBaseType=int potentialQualifiedName=field_origins.Point.x isAmbiguous=false startLine=18 endLine=18 pyTypeLinkHash=PY_TYPE_6b71a387bb09f3559bd7785e8741463e ownerTypeName=Point ownerQualifiedName=field_origins.Point fieldAccess=PUBLIC_ACCESS fieldModifier=CLASS_VAR,DATACLASS_FIELD,READ_ONLY fieldOrigin=DATACLASS_FIELD declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=18 hasAnnotation=true annotationIsString=false initializerText= initializerKind=NONE pyModuleLinkHash=PY_MODULE_d9b6cd4b9890511117f0581289c3e72e bindingLinkHash=PY_BINDING_faff6556d980286b5caffa3120d0a328 pyExpressionLinkHash=PY_EXPRESSION_d3a3294efad0cccf2cebd3a749b421ca serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_7d18be1a9fe29d0bed13a216fb06f410 -name=y fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=10 endLine=10 pyTypeLinkHash=PY_TYPE_6f4e90e4697b76a388566c9bd84e0d4d ownerTypeName=Point ownerQualifiedName=match_class_and_sequence_patterns.Point fieldAccess=PUBLIC_ACCESS fieldModifier=INSTANCE_VAR,READ_ONLY fieldOrigin=SELF_ASSIGN declaringMethodLinkHash=PY_METHOD_ed898c7ba31b1d5a88a7ed47da6a477b receiverName=self isDeclaredInInit=true writeCount=1 writtenInMethodCount=1 firstWriteLine=10 hasAnnotation=false annotationIsString=false initializerText=y initializerKind=NAME pyModuleLinkHash=PY_MODULE_e8c22c801b9d7d33638ace57665fdd49 bindingLinkHash= pyExpressionLinkHash=PY_EXPRESSION_0b2011f5a35e76274b3622f5fcb378c2 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_39c1e4363707f3951248f99912d45ae9 -name=y fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=21 endLine=21 pyTypeLinkHash=PY_TYPE_834b419437b855738443676b9b3cada0 ownerTypeName=WithSlots ownerQualifiedName=class_forms.WithSlots fieldAccess=PUBLIC_ACCESS fieldModifier=SLOT,INSTANCE_VAR,READ_ONLY fieldOrigin=SLOTS_ENTRY declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=21 hasAnnotation=false annotationIsString=false initializerText= initializerKind=NONE pyModuleLinkHash=PY_MODULE_512fa5aa67cc77834aa18c596c931e59 bindingLinkHash= pyExpressionLinkHash=PY_EXPRESSION_259ffe8cc6332d9477a5ec7ca24bb921 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_11cbc9360f3ced40836b98405f95cda3 -name=y fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=25 endLine=25 pyTypeLinkHash=PY_TYPE_834b419437b855738443676b9b3cada0 ownerTypeName=WithSlots ownerQualifiedName=class_forms.WithSlots fieldAccess=PUBLIC_ACCESS fieldModifier=INSTANCE_VAR,SLOT,READ_ONLY fieldOrigin=SELF_ASSIGN declaringMethodLinkHash=PY_METHOD_1c60534bccbeaabf71d83fbb629164fb receiverName=self isDeclaredInInit=true writeCount=1 writtenInMethodCount=1 firstWriteLine=25 hasAnnotation=false annotationIsString=false initializerText=2 initializerKind=LITERAL pyModuleLinkHash=PY_MODULE_512fa5aa67cc77834aa18c596c931e59 bindingLinkHash= pyExpressionLinkHash=PY_EXPRESSION_341ada2d54c00d80488099254b019ebe serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_0a33242ff4f96e4f7da2aaf37f7390af -name=y fieldTypeName=int fieldBaseType=int potentialQualifiedName=field_origins.Point.y isAmbiguous=false startLine=19 endLine=19 pyTypeLinkHash=PY_TYPE_6b71a387bb09f3559bd7785e8741463e ownerTypeName=Point ownerQualifiedName=field_origins.Point fieldAccess=PUBLIC_ACCESS fieldModifier=CLASS_VAR,DATACLASS_FIELD,READ_ONLY fieldOrigin=DATACLASS_FIELD declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=19 hasAnnotation=true annotationIsString=false initializerText=0 initializerKind=LITERAL pyModuleLinkHash=PY_MODULE_d9b6cd4b9890511117f0581289c3e72e bindingLinkHash=PY_BINDING_16132b28e5f39ba60433d84427b51e50 pyExpressionLinkHash=PY_EXPRESSION_4c779c40db426accfc5948670ab22620 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_54dec3f2ca5dacd7edb5e5868dfee299 +name=GREEN fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=31 endLine=31 pyTypeLinkHash=PY_TYPE_9e523515e44d6cfd9bc7abbd870a39fc ownerTypeName=Colour ownerQualifiedName=class_forms.Colour fieldAccess=PUBLIC_ACCESS fieldModifier=CLASS_VAR,ENUM_MEMBER,READ_ONLY fieldOrigin=ENUM_MEMBER declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=31 hasAnnotation=false annotationIsString=false initializerText=2 initializerKind=LITERAL pyModuleLinkHash=PY_MODULE_512fa5aa67cc77834aa18c596c931e59 bindingLinkHash=PY_BINDING_57ddbcd9c75cb175fbf6a58f0413624c pyExpressionLinkHash=PY_EXPRESSION_6b100833fc3d59ad93d115d8db3d7889 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_354cf9941bff4d01e1a412286829e26f +name=KIND fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=6 endLine=6 pyTypeLinkHash=PY_TYPE_bf6354f36ebb9ff7d338d07707f4d6c9 ownerTypeName=Builder ownerQualifiedName=core.factory.Builder fieldAccess=PUBLIC_ACCESS fieldModifier=CLASS_VAR,READ_ONLY fieldOrigin=CLASS_BODY_ASSIGN declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=6 hasAnnotation=false annotationIsString=false initializerText="""builder""" initializerKind=LITERAL pyModuleLinkHash=PY_MODULE_7908beb43f8c739558eabfcf93ebca84 bindingLinkHash=PY_BINDING_8f17cce2244c83d9f0b22c927181e57c pyExpressionLinkHash=PY_EXPRESSION_6b2dc1f944007de6dc6ad962a10c4d68 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_da9d8e5a0a6fb23461a6d67eebf0b406 +name=RED fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=30 endLine=30 pyTypeLinkHash=PY_TYPE_9e523515e44d6cfd9bc7abbd870a39fc ownerTypeName=Colour ownerQualifiedName=class_forms.Colour fieldAccess=PUBLIC_ACCESS fieldModifier=CLASS_VAR,ENUM_MEMBER,READ_ONLY fieldOrigin=ENUM_MEMBER declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=30 hasAnnotation=false annotationIsString=false initializerText=1 initializerKind=LITERAL pyModuleLinkHash=PY_MODULE_512fa5aa67cc77834aa18c596c931e59 bindingLinkHash=PY_BINDING_788efc874ee5c9fe8de3cf8d313ccb08 pyExpressionLinkHash=PY_EXPRESSION_08330318b58d2f5435334c19e44e1bad serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_b63b80d192db3ec3d30504b33ab5a7d5 +name=_Inner__secret fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=27 endLine=27 pyTypeLinkHash=PY_TYPE_e0b00a82da98016f61db58a6de64ca3a ownerTypeName=Inner ownerQualifiedName=name_mangling_edge_cases.Outer.Inner fieldAccess=PRIVATE_ACCESS fieldModifier=CLASS_VAR,READ_ONLY fieldOrigin=CLASS_BODY_ASSIGN declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=27 hasAnnotation=false annotationIsString=false initializerText="""inner secret""" initializerKind=LITERAL pyModuleLinkHash=PY_MODULE_75dd800d24b53dd3ca1d826ca1525876 bindingLinkHash=PY_BINDING_5f168c8d5c239011cb96ae52de48a359 pyExpressionLinkHash=PY_EXPRESSION_8d9a61772e886da7597f48f8d04adb1a serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_2ee87edc1495cf4099a701d55e5e6c46 +name=_Outer__secret fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=24 endLine=24 pyTypeLinkHash=PY_TYPE_fd26c3cd94bd9663ee01dd2cfe94159d ownerTypeName=Outer ownerQualifiedName=name_mangling_edge_cases.Outer fieldAccess=PRIVATE_ACCESS fieldModifier=CLASS_VAR,READ_ONLY fieldOrigin=CLASS_BODY_ASSIGN declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=24 hasAnnotation=false annotationIsString=false initializerText="""outer secret""" initializerKind=LITERAL pyModuleLinkHash=PY_MODULE_75dd800d24b53dd3ca1d826ca1525876 bindingLinkHash=PY_BINDING_49c59ee9461329034a85a0296cef5067 pyExpressionLinkHash=PY_EXPRESSION_37ac9136831ba123510a02a1f4e8a855 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_f2cd30b8381aef7fb269f0afaa8e87df +name=_v fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=24 endLine=24 pyTypeLinkHash=PY_TYPE_a1bd5124fede6d4f3504a0dd00092899 ownerTypeName=Kinds ownerQualifiedName=method_kinds.Kinds fieldAccess=PROTECTED_ACCESS fieldModifier=INSTANCE_VAR,READ_ONLY fieldOrigin=SELF_ASSIGN declaringMethodLinkHash=PY_METHOD_43ebe179bc6f5e46ee12ceb6ef8f8371 receiverName=self isDeclaredInInit=false writeCount=1 writtenInMethodCount=1 firstWriteLine=24 hasAnnotation=false annotationIsString=false initializerText=value initializerKind=NAME pyModuleLinkHash=PY_MODULE_7f80b0a69e6ccd5fc2e3932cc9e5dc10 bindingLinkHash= pyExpressionLinkHash=PY_EXPRESSION_6c7b177707416257783b9ec57e0e0db7 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_dcf0d30e2575c32c0165dde58ab421cd +name=a fieldTypeName=int fieldBaseType=int potentialQualifiedName=field_origins.Named.a isAmbiguous=false startLine=27 endLine=27 pyTypeLinkHash=PY_TYPE_57e2471ba226031232617e9a2c039483 ownerTypeName=Named ownerQualifiedName=field_origins.Named fieldAccess=PUBLIC_ACCESS fieldModifier=CLASS_VAR,READ_ONLY fieldOrigin=NAMEDTUPLE_FIELD declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=27 hasAnnotation=true annotationIsString=false initializerText= initializerKind=NONE pyModuleLinkHash=PY_MODULE_d9b6cd4b9890511117f0581289c3e72e bindingLinkHash=PY_BINDING_9e2b1a44d2cdbd153e83899e6455543a pyExpressionLinkHash=PY_EXPRESSION_655c42272094ed05fdc74a8ceca41e9a serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_f5cf13ceb805ace0621794c47b0edd1c +name=amount fieldTypeName=int fieldBaseType=int potentialQualifiedName=service_layer.Record.amount isAmbiguous=false startLine=9 endLine=9 pyTypeLinkHash=PY_TYPE_8ffa51c20183b9069bc165293685e3fe ownerTypeName=Record ownerQualifiedName=service_layer.Record fieldAccess=PUBLIC_ACCESS fieldModifier=CLASS_VAR,DATACLASS_FIELD,READ_ONLY fieldOrigin=DATACLASS_FIELD declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=9 hasAnnotation=true annotationIsString=false initializerText= initializerKind=NONE pyModuleLinkHash=PY_MODULE_87ff823ca7cda9220c2fe03210807591 bindingLinkHash=PY_BINDING_57bc7c03bfbb607dd13cde9fc0c4fa82 pyExpressionLinkHash=PY_EXPRESSION_0e91a6686acdabf7ba17b29df0ed45ef serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_1b8b80b6ac20cbea90df5020685db27e +name=args fieldTypeName=tuple fieldBaseType=tuple potentialQualifiedName=match_nested_patterns_and_guards.Command.args isAmbiguous=false startLine=18 endLine=18 pyTypeLinkHash=PY_TYPE_0d090a4533bb97a6729a4b05d91e8042 ownerTypeName=Command ownerQualifiedName=match_nested_patterns_and_guards.Command fieldAccess=PUBLIC_ACCESS fieldModifier=CLASS_VAR,DATACLASS_FIELD,READ_ONLY fieldOrigin=DATACLASS_FIELD declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=18 hasAnnotation=true annotationIsString=false initializerText= initializerKind=NONE pyModuleLinkHash=PY_MODULE_fcb43aba22913355ac115ae9c4556240 bindingLinkHash=PY_BINDING_9a435ed4c1ece9c11135dbd0160b4df5 pyExpressionLinkHash=PY_EXPRESSION_0ee6d1d4f1d073dd98461650dcad5106 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_3957058ce75e0648a430fbe98178267e +name=attribute fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=14 endLine=14 pyTypeLinkHash=PY_TYPE_ba2fbe8e09ca96c2ac317281255eb0d6 ownerTypeName=Documented ownerQualifiedName=comment_forms.Documented fieldAccess=PUBLIC_ACCESS fieldModifier=CLASS_VAR,READ_ONLY fieldOrigin=CLASS_BODY_ASSIGN declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=14 hasAnnotation=false annotationIsString=false initializerText=1 initializerKind=LITERAL pyModuleLinkHash=PY_MODULE_898ba18a31075a2ba7818f72c287b8d1 bindingLinkHash=PY_BINDING_2424a859b65550cd9888982deae03d22 pyExpressionLinkHash=PY_EXPRESSION_ffabf59979fb14780a4b3608e603c0d1 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_385e7b366a08ca3716f29841e22cc22f +name=b fieldTypeName=str fieldBaseType=str potentialQualifiedName=field_origins.Named.b isAmbiguous=false startLine=28 endLine=28 pyTypeLinkHash=PY_TYPE_57e2471ba226031232617e9a2c039483 ownerTypeName=Named ownerQualifiedName=field_origins.Named fieldAccess=PUBLIC_ACCESS fieldModifier=CLASS_VAR,READ_ONLY fieldOrigin=NAMEDTUPLE_FIELD declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=28 hasAnnotation=true annotationIsString=false initializerText= initializerKind=NONE pyModuleLinkHash=PY_MODULE_d9b6cd4b9890511117f0581289c3e72e bindingLinkHash=PY_BINDING_9557301ac4f28d860f8ea85d7d5f12c3 pyExpressionLinkHash=PY_EXPRESSION_3ef8970040c01d72c72ad800129733ee serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_310894d9c629bedb0d3af75ed37d2926 +name=children fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=7 endLine=7 pyTypeLinkHash=PY_TYPE_114cb72d42012abcb4ffcbce3bc6a345 ownerTypeName=Node ownerQualifiedName=core.base.Node fieldAccess=PUBLIC_ACCESS fieldModifier=INSTANCE_VAR,READ_ONLY fieldOrigin=SELF_ASSIGN declaringMethodLinkHash=PY_METHOD_1800af667e7076b626bd654b5e3dbebd receiverName=self isDeclaredInInit=true writeCount=1 writtenInMethodCount=1 firstWriteLine=7 hasAnnotation=false annotationIsString=false initializerText=[] initializerKind=LITERAL pyModuleLinkHash=PY_MODULE_0af7a9df251376bafe876afe4a32f46e bindingLinkHash= pyExpressionLinkHash=PY_EXPRESSION_2b5c5d4e2ede82425c6cc08afb31af7e serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_379b43102358abde65f30ca1de0bcd84 +name=class_body_annotation fieldTypeName=int fieldBaseType=int potentialQualifiedName=field_origins.Origins.class_body_annotation isAmbiguous=false startLine=8 endLine=8 pyTypeLinkHash=PY_TYPE_8e5e7ae02d7e897e2dae13f4d1fc41bc ownerTypeName=Origins ownerQualifiedName=field_origins.Origins fieldAccess=PUBLIC_ACCESS fieldModifier=CLASS_VAR,READ_ONLY fieldOrigin=CLASS_BODY_ANNOTATION_ONLY declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=8 hasAnnotation=true annotationIsString=false initializerText= initializerKind=NONE pyModuleLinkHash=PY_MODULE_d9b6cd4b9890511117f0581289c3e72e bindingLinkHash=PY_BINDING_b06aa81bc5c9cd99d90ba02007b150fe pyExpressionLinkHash=PY_EXPRESSION_545963f8035cf0bdb65e61c5d4e613c6 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_95475ba063df3c93c21f1c308805edd9 +name=class_body_assign fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=7 endLine=7 pyTypeLinkHash=PY_TYPE_8e5e7ae02d7e897e2dae13f4d1fc41bc ownerTypeName=Origins ownerQualifiedName=field_origins.Origins fieldAccess=PUBLIC_ACCESS fieldModifier=CLASS_VAR,READ_ONLY fieldOrigin=CLASS_BODY_ASSIGN declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=7 hasAnnotation=false annotationIsString=false initializerText=1 initializerKind=LITERAL pyModuleLinkHash=PY_MODULE_d9b6cd4b9890511117f0581289c3e72e bindingLinkHash=PY_BINDING_1d3d16a7ecf67dc4f185bb6856b55ce1 pyExpressionLinkHash=PY_EXPRESSION_4c58afc15bc350db5af24aafaf24281c serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_56d654562f909d6501f78a7efbec6215 +name=class_var fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=53 endLine=53 pyTypeLinkHash=PY_TYPE_e61b2b74f7302f1be447bd28221d2310 ownerTypeName=ClassScope ownerQualifiedName=scope_forms.ClassScope fieldAccess=PUBLIC_ACCESS fieldModifier=CLASS_VAR,READ_ONLY fieldOrigin=CLASS_BODY_ASSIGN declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=53 hasAnnotation=false annotationIsString=false initializerText=1 initializerKind=LITERAL pyModuleLinkHash=PY_MODULE_f56326f63a4c5bef9294b28a4acb9abc bindingLinkHash=PY_BINDING_4bcd55d471aae0bad8d158832c4e4dca pyExpressionLinkHash=PY_EXPRESSION_6068c5654402f0188994f976ddff8750 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_395310756cb1d1d83c7b698fea57e4dc +name=count fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=67 endLine=67 pyTypeLinkHash=PY_TYPE_35883ba9ad396e2203b42abef9e1d7c9 ownerTypeName=Chained ownerQualifiedName=resolution_edges.Chained fieldAccess=PUBLIC_ACCESS fieldModifier=INSTANCE_VAR,READ_ONLY fieldOrigin=SELF_ASSIGN declaringMethodLinkHash=PY_METHOD_994dce81c215c9114b56d78e93cdf732 receiverName=self isDeclaredInInit=true writeCount=1 writtenInMethodCount=1 firstWriteLine=67 hasAnnotation=false annotationIsString=false initializerText=0 initializerKind=LITERAL pyModuleLinkHash=PY_MODULE_daef721b73c8bfbcc0348299f2f7bf9a bindingLinkHash= pyExpressionLinkHash=PY_EXPRESSION_7b0cae40fc8c704752083b3ee0fceb16 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_21ead56058d3d069ccf562ee8f4901d4 +name=count fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=70 endLine=70 pyTypeLinkHash=PY_TYPE_35883ba9ad396e2203b42abef9e1d7c9 ownerTypeName=Chained ownerQualifiedName=resolution_edges.Chained fieldAccess=PUBLIC_ACCESS fieldModifier=INSTANCE_VAR fieldOrigin=SELF_AUGASSIGN declaringMethodLinkHash=PY_METHOD_b561ec322633cc1dd8bcac47c5b8c82b receiverName=self isDeclaredInInit=false writeCount=1 writtenInMethodCount=1 firstWriteLine=70 hasAnnotation=false annotationIsString=false initializerText= initializerKind=NONE pyModuleLinkHash=PY_MODULE_daef721b73c8bfbcc0348299f2f7bf9a bindingLinkHash= pyExpressionLinkHash=PY_EXPRESSION_76e084392d2dd97ca35228a147447c5e serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_cbc349dfa7dba6a7f967589d4623516d +name=data fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=23 endLine=23 pyTypeLinkHash=PY_TYPE_b4aa287abde8dbb60cac1736e458094f ownerTypeName=ClassScopeIsInvisibleToComprehensions ownerQualifiedName=scoping_edge_cases.ClassScopeIsInvisibleToComprehensions fieldAccess=PUBLIC_ACCESS fieldModifier=CLASS_VAR,READ_ONLY fieldOrigin=CLASS_BODY_ASSIGN declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=23 hasAnnotation=false annotationIsString=false initializerText=[1, 2, 3] initializerKind=LITERAL pyModuleLinkHash=PY_MODULE_7c5670e72548f0c21d5e8710e5a91903 bindingLinkHash=PY_BINDING_2979d1fb44aef0644d73caeef4e16875 pyExpressionLinkHash=PY_EXPRESSION_9d502d9e8053c97698b1fd82a5f1ef02 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_bebc562b5a7574ce8ac9e36ada3ef18c +name=doubled fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=28 endLine=28 pyTypeLinkHash=PY_TYPE_b4aa287abde8dbb60cac1736e458094f ownerTypeName=ClassScopeIsInvisibleToComprehensions ownerQualifiedName=scoping_edge_cases.ClassScopeIsInvisibleToComprehensions fieldAccess=PUBLIC_ACCESS fieldModifier=CLASS_VAR,READ_ONLY fieldOrigin=CLASS_BODY_ASSIGN declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=28 hasAnnotation=false annotationIsString=false initializerText=[item * 2 for item in data] initializerKind=COMPREHENSION pyModuleLinkHash=PY_MODULE_7c5670e72548f0c21d5e8710e5a91903 bindingLinkHash=PY_BINDING_463a0938fe7b9c7d0b98f8a91a5fa9b1 pyExpressionLinkHash=PY_EXPRESSION_7a1c506cbc933dcebc9cff34cfeb9098 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_f84a1f38e2ec605e0f7371d09882a819 +name=key fieldTypeName=int fieldBaseType=int potentialQualifiedName=field_origins.Typed.key isAmbiguous=false startLine=32 endLine=32 pyTypeLinkHash=PY_TYPE_ab0f66955e01d63bfcdb185cba8220c9 ownerTypeName=Typed ownerQualifiedName=field_origins.Typed fieldAccess=PUBLIC_ACCESS fieldModifier=CLASS_VAR,READ_ONLY fieldOrigin=TYPEDDICT_KEY declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=32 hasAnnotation=true annotationIsString=false initializerText= initializerKind=NONE pyModuleLinkHash=PY_MODULE_d9b6cd4b9890511117f0581289c3e72e bindingLinkHash=PY_BINDING_e2bb803db7c6d1eb22f6564f99c728a6 pyExpressionLinkHash=PY_EXPRESSION_cf8c36787653df27e29b2e8d273a91a4 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_cfe099bdbc0b4a62a3d6135ca67cf7c0 +name=key fieldTypeName=str fieldBaseType=str potentialQualifiedName=service_layer.Record.key isAmbiguous=false startLine=8 endLine=8 pyTypeLinkHash=PY_TYPE_8ffa51c20183b9069bc165293685e3fe ownerTypeName=Record ownerQualifiedName=service_layer.Record fieldAccess=PUBLIC_ACCESS fieldModifier=CLASS_VAR,DATACLASS_FIELD,READ_ONLY fieldOrigin=DATACLASS_FIELD declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=8 hasAnnotation=true annotationIsString=false initializerText= initializerKind=NONE pyModuleLinkHash=PY_MODULE_87ff823ca7cda9220c2fe03210807591 bindingLinkHash=PY_BINDING_8c140f9ae98b25bc5c0a4168c96dc0dc pyExpressionLinkHash=PY_EXPRESSION_02ca24b3af6950ca1b62257fad48588b serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_27261db33e56b96f29132dfaa71d3f4e +name=kind fieldTypeName=str fieldBaseType=str potentialQualifiedName=match_nested_patterns_and_guards.Event.kind isAmbiguous=false startLine=11 endLine=11 pyTypeLinkHash=PY_TYPE_2ce58f5e8c9675c1e0fd5c50ffba85b9 ownerTypeName=Event ownerQualifiedName=match_nested_patterns_and_guards.Event fieldAccess=PUBLIC_ACCESS fieldModifier=CLASS_VAR,DATACLASS_FIELD,READ_ONLY fieldOrigin=DATACLASS_FIELD declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=11 hasAnnotation=true annotationIsString=false initializerText= initializerKind=NONE pyModuleLinkHash=PY_MODULE_fcb43aba22913355ac115ae9c4556240 bindingLinkHash=PY_BINDING_a71edea3725a72a19e6afe34df82df70 pyExpressionLinkHash=PY_EXPRESSION_24ae5eca16a253b79944f8cf60d1f4cc serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_adf2e9134c1d3b66aedefcfe1ecbe569 +name=label fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=41 endLine=41 pyTypeLinkHash=PY_TYPE_cb9da9964bc3c43761a4e1269506effe ownerTypeName=ClassScopeIsInvisibleToMethods ownerQualifiedName=scoping_edge_cases.ClassScopeIsInvisibleToMethods fieldAccess=PUBLIC_ACCESS fieldModifier=CLASS_VAR,READ_ONLY fieldOrigin=CLASS_BODY_ASSIGN declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=41 hasAnnotation=false annotationIsString=false initializerText="""class attribute""" initializerKind=LITERAL pyModuleLinkHash=PY_MODULE_7c5670e72548f0c21d5e8710e5a91903 bindingLinkHash=PY_BINDING_98ec45593e2cb658d620508b81299faa pyExpressionLinkHash=PY_EXPRESSION_42fe92a294647ed36376fb8eb05bcab7 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_f1fd14ac02e06017fd967c9e6fed6fb3 +name=n fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=6 endLine=6 pyTypeLinkHash=PY_TYPE_b2f97d5a7e48f40b008fc644ae603fdf ownerTypeName=Holder ownerQualifiedName=expression_kinds.Holder fieldAccess=PUBLIC_ACCESS fieldModifier=INSTANCE_VAR,READ_ONLY fieldOrigin=SELF_ASSIGN declaringMethodLinkHash=PY_METHOD_9949f650301345b4e4deaca03bd84aa2 receiverName=self isDeclaredInInit=true writeCount=1 writtenInMethodCount=1 firstWriteLine=6 hasAnnotation=false annotationIsString=false initializerText=n initializerKind=NAME pyModuleLinkHash=PY_MODULE_02d561b0acde0974e99e75b89b4bdab0 bindingLinkHash= pyExpressionLinkHash=PY_EXPRESSION_8d749d70dcd6b628deac2048e53d55e0 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_9df925d8945d2bf31f49db8111a0dc69 +name=name fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=18 endLine=18 pyTypeLinkHash=PY_TYPE_bf6354f36ebb9ff7d338d07707f4d6c9 ownerTypeName=Builder ownerQualifiedName=core.factory.Builder fieldAccess=PUBLIC_ACCESS fieldModifier=INSTANCE_VAR,READ_ONLY fieldOrigin=SELF_ASSIGN declaringMethodLinkHash=PY_METHOD_bd7c847866b0674467ec65fee212e98d receiverName=self isDeclaredInInit=true writeCount=1 writtenInMethodCount=1 firstWriteLine=18 hasAnnotation=false annotationIsString=false initializerText=name initializerKind=NAME pyModuleLinkHash=PY_MODULE_7908beb43f8c739558eabfcf93ebca84 bindingLinkHash= pyExpressionLinkHash=PY_EXPRESSION_585104a79ffa32b57b756846339f5739 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_e099ac70f91cfbdc5ff7c13e73233075 +name=name fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=6 endLine=6 pyTypeLinkHash=PY_TYPE_114cb72d42012abcb4ffcbce3bc6a345 ownerTypeName=Node ownerQualifiedName=core.base.Node fieldAccess=PUBLIC_ACCESS fieldModifier=INSTANCE_VAR,READ_ONLY fieldOrigin=SELF_ASSIGN declaringMethodLinkHash=PY_METHOD_1800af667e7076b626bd654b5e3dbebd receiverName=self isDeclaredInInit=true writeCount=1 writtenInMethodCount=1 firstWriteLine=6 hasAnnotation=false annotationIsString=false initializerText=name initializerKind=NAME pyModuleLinkHash=PY_MODULE_0af7a9df251376bafe876afe4a32f46e bindingLinkHash= pyExpressionLinkHash=PY_EXPRESSION_105c90e8c0edac7578788345181e8b7f serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_4892cbb3eae7d00e22619a4bee9e4477 +name=name fieldTypeName=str fieldBaseType=str potentialQualifiedName=match_nested_patterns_and_guards.Command.name isAmbiguous=false startLine=17 endLine=17 pyTypeLinkHash=PY_TYPE_0d090a4533bb97a6729a4b05d91e8042 ownerTypeName=Command ownerQualifiedName=match_nested_patterns_and_guards.Command fieldAccess=PUBLIC_ACCESS fieldModifier=CLASS_VAR,DATACLASS_FIELD,READ_ONLY fieldOrigin=DATACLASS_FIELD declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=17 hasAnnotation=true annotationIsString=false initializerText= initializerKind=NONE pyModuleLinkHash=PY_MODULE_fcb43aba22913355ac115ae9c4556240 bindingLinkHash=PY_BINDING_cd0d311bf325ef8c8ae6238a63dcad6f pyExpressionLinkHash=PY_EXPRESSION_eac151d5d6927868317023b3e1775a9d serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_bdf77c8fc8ad7a8203a0dbfdd9def840 +name=node fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=19 endLine=19 pyTypeLinkHash=PY_TYPE_bf6354f36ebb9ff7d338d07707f4d6c9 ownerTypeName=Builder ownerQualifiedName=core.factory.Builder fieldAccess=PUBLIC_ACCESS fieldModifier=INSTANCE_VAR,READ_ONLY fieldOrigin=SELF_ASSIGN declaringMethodLinkHash=PY_METHOD_bd7c847866b0674467ec65fee212e98d receiverName=self isDeclaredInInit=true writeCount=1 writtenInMethodCount=1 firstWriteLine=19 hasAnnotation=false annotationIsString=false initializerText=Node(name) initializerKind=CALL pyModuleLinkHash=PY_MODULE_7908beb43f8c739558eabfcf93ebca84 bindingLinkHash= pyExpressionLinkHash=PY_EXPRESSION_e901fe2384634e118a14e9746dc8d29a serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_49ef51dcaf6157efde16ddf34306974e +name=nodes fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=28 endLine=28 pyTypeLinkHash=PY_TYPE_f511a7eca38906948dce8170bb4e5495 ownerTypeName=Registry ownerQualifiedName=core.base.Registry fieldAccess=PUBLIC_ACCESS fieldModifier=INSTANCE_VAR,READ_ONLY fieldOrigin=SELF_ASSIGN declaringMethodLinkHash=PY_METHOD_d7a26baec95db1ac47ae906b256b56b6 receiverName=self isDeclaredInInit=true writeCount=1 writtenInMethodCount=1 firstWriteLine=28 hasAnnotation=false annotationIsString=false initializerText=[] initializerKind=LITERAL pyModuleLinkHash=PY_MODULE_0af7a9df251376bafe876afe4a32f46e bindingLinkHash= pyExpressionLinkHash=PY_EXPRESSION_37663bc3f580f7f4b5e952c3b83bbb53 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_2a7e11b6b84f1f30e344016dbc9c423d +name=payload fieldTypeName=dict fieldBaseType=dict potentialQualifiedName=match_nested_patterns_and_guards.Event.payload isAmbiguous=false startLine=12 endLine=12 pyTypeLinkHash=PY_TYPE_2ce58f5e8c9675c1e0fd5c50ffba85b9 ownerTypeName=Event ownerQualifiedName=match_nested_patterns_and_guards.Event fieldAccess=PUBLIC_ACCESS fieldModifier=CLASS_VAR,DATACLASS_FIELD,READ_ONLY fieldOrigin=DATACLASS_FIELD declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=12 hasAnnotation=true annotationIsString=false initializerText= initializerKind=NONE pyModuleLinkHash=PY_MODULE_fcb43aba22913355ac115ae9c4556240 bindingLinkHash=PY_BINDING_13c4c5fdb58a9e4c8b2de72989a22932 pyExpressionLinkHash=PY_EXPRESSION_1586dc4c0c9ec70cb3d13c84f1727e77 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_01ef6b233822f48581ac56724f516c07 +name=registered fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=36 endLine=36 pyTypeLinkHash=PY_TYPE_a1bd5124fede6d4f3504a0dd00092899 ownerTypeName=Kinds ownerQualifiedName=method_kinds.Kinds fieldAccess=PUBLIC_ACCESS fieldModifier=INSTANCE_VAR,READ_ONLY fieldOrigin=SELF_ASSIGN declaringMethodLinkHash=PY_METHOD_5c50c5642d36a230fa6b6e9f7ed1d793 receiverName=cls isDeclaredInInit=false writeCount=1 writtenInMethodCount=1 firstWriteLine=36 hasAnnotation=false annotationIsString=false initializerText=True initializerKind=LITERAL pyModuleLinkHash=PY_MODULE_7f80b0a69e6ccd5fc2e3932cc9e5dc10 bindingLinkHash= pyExpressionLinkHash=PY_EXPRESSION_770096a696c823a0acb4d74638579069 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_5eee83bd12ab74a7e50ee0ca4f615196 +name=repository fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=44 endLine=44 pyTypeLinkHash=PY_TYPE_c4ea4c823c48edb338a6cd78787cae9b ownerTypeName=Service ownerQualifiedName=service_layer.Service fieldAccess=PUBLIC_ACCESS fieldModifier=INSTANCE_VAR,READ_ONLY fieldOrigin=SELF_ASSIGN declaringMethodLinkHash=PY_METHOD_c2679ef7c7ff76fd0d905dfb8219e815 receiverName=self isDeclaredInInit=true writeCount=1 writtenInMethodCount=1 firstWriteLine=44 hasAnnotation=false annotationIsString=false initializerText=repository initializerKind=NAME pyModuleLinkHash=PY_MODULE_87ff823ca7cda9220c2fe03210807591 bindingLinkHash= pyExpressionLinkHash=PY_EXPRESSION_39117b39cc41afe8b691c23f84675db1 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_ba06c6ab6360c63d00ccbdfb193ee986 +name=rows fieldTypeName=typing.List[Record] fieldBaseType=List potentialQualifiedName=service_layer.Store.rows isAmbiguous=false startLine=17 endLine=17 pyTypeLinkHash=PY_TYPE_2cf22ea62c0a0c4b7621a04b81853658 ownerTypeName=Store ownerQualifiedName=service_layer.Store fieldAccess=PUBLIC_ACCESS fieldModifier=INSTANCE_VAR,READ_ONLY fieldOrigin=SELF_ASSIGN declaringMethodLinkHash=PY_METHOD_1b1abae80728c42e4cc6b0dbc18b5ec2 receiverName=self isDeclaredInInit=true writeCount=1 writtenInMethodCount=1 firstWriteLine=17 hasAnnotation=true annotationIsString=false initializerText=[] initializerKind=LITERAL pyModuleLinkHash=PY_MODULE_87ff823ca7cda9220c2fe03210807591 bindingLinkHash= pyExpressionLinkHash=PY_EXPRESSION_ef6124b63d25a3882170fe90d7e7aa10 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_982e6f2f24bd41d8e0dcef33a86a3a6a +name=scaled fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=37 endLine=37 pyTypeLinkHash=PY_TYPE_b4aa287abde8dbb60cac1736e458094f ownerTypeName=ClassScopeIsInvisibleToComprehensions ownerQualifiedName=scoping_edge_cases.ClassScopeIsInvisibleToComprehensions fieldAccess=PUBLIC_ACCESS fieldModifier=CLASS_VAR,READ_ONLY fieldOrigin=CLASS_BODY_ASSIGN declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=37 hasAnnotation=false annotationIsString=false initializerText=[item * data[0] for item in range(3)] initializerKind=COMPREHENSION pyModuleLinkHash=PY_MODULE_7c5670e72548f0c21d5e8710e5a91903 bindingLinkHash=PY_BINDING_b6ba5ccaaf2812fdfe59e082e4220ac8 pyExpressionLinkHash=PY_EXPRESSION_96eea804d6ac4509c9232efc3d58a9bf serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_38c6f01897875da284ae4ed20953ccf5 +name=self_assign fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=12 endLine=12 pyTypeLinkHash=PY_TYPE_8e5e7ae02d7e897e2dae13f4d1fc41bc ownerTypeName=Origins ownerQualifiedName=field_origins.Origins fieldAccess=PUBLIC_ACCESS fieldModifier=INSTANCE_VAR,READ_ONLY fieldOrigin=SELF_ASSIGN declaringMethodLinkHash=PY_METHOD_0392ee9e7a4bc56bb004a6e7afba21d3 receiverName=self isDeclaredInInit=true writeCount=1 writtenInMethodCount=1 firstWriteLine=12 hasAnnotation=false annotationIsString=false initializerText=2 initializerKind=LITERAL pyModuleLinkHash=PY_MODULE_d9b6cd4b9890511117f0581289c3e72e bindingLinkHash= pyExpressionLinkHash=PY_EXPRESSION_50aab41b2a79282580adb17ecd509bf4 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_9dd57248346cd4c94d18e3ae6a54e092 +name=self_augassign fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=13 endLine=13 pyTypeLinkHash=PY_TYPE_8e5e7ae02d7e897e2dae13f4d1fc41bc ownerTypeName=Origins ownerQualifiedName=field_origins.Origins fieldAccess=PUBLIC_ACCESS fieldModifier=INSTANCE_VAR,READ_ONLY fieldOrigin=SELF_ASSIGN declaringMethodLinkHash=PY_METHOD_0392ee9e7a4bc56bb004a6e7afba21d3 receiverName=self isDeclaredInInit=true writeCount=1 writtenInMethodCount=1 firstWriteLine=13 hasAnnotation=false annotationIsString=false initializerText=0 initializerKind=LITERAL pyModuleLinkHash=PY_MODULE_d9b6cd4b9890511117f0581289c3e72e bindingLinkHash= pyExpressionLinkHash=PY_EXPRESSION_c848ec2b334a0c0c95ecf82516738045 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_a08b36eb3272a0f66469bbe7d307dd42 +name=self_augassign fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=14 endLine=14 pyTypeLinkHash=PY_TYPE_8e5e7ae02d7e897e2dae13f4d1fc41bc ownerTypeName=Origins ownerQualifiedName=field_origins.Origins fieldAccess=PUBLIC_ACCESS fieldModifier=INSTANCE_VAR fieldOrigin=SELF_AUGASSIGN declaringMethodLinkHash=PY_METHOD_0392ee9e7a4bc56bb004a6e7afba21d3 receiverName=self isDeclaredInInit=true writeCount=1 writtenInMethodCount=1 firstWriteLine=14 hasAnnotation=false annotationIsString=false initializerText= initializerKind=NONE pyModuleLinkHash=PY_MODULE_d9b6cd4b9890511117f0581289c3e72e bindingLinkHash= pyExpressionLinkHash=PY_EXPRESSION_6e8a8a980cbdfe31ca1f70cf5768aa54 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_e63bf9a63c8f71ab184065a04e212c41 +name=slot_entry fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=9 endLine=9 pyTypeLinkHash=PY_TYPE_8e5e7ae02d7e897e2dae13f4d1fc41bc ownerTypeName=Origins ownerQualifiedName=field_origins.Origins fieldAccess=PUBLIC_ACCESS fieldModifier=SLOT,INSTANCE_VAR,READ_ONLY fieldOrigin=SLOTS_ENTRY declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=9 hasAnnotation=false annotationIsString=false initializerText= initializerKind=NONE pyModuleLinkHash=PY_MODULE_d9b6cd4b9890511117f0581289c3e72e bindingLinkHash= pyExpressionLinkHash=PY_EXPRESSION_c3dd5c9baa37a65645ba641deaf75370 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_3b691937578677fc25973ac19b74dd84 +name=store fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=28 endLine=28 pyTypeLinkHash=PY_TYPE_2dfd4389681449004ff326855f81c683 ownerTypeName=Repository ownerQualifiedName=service_layer.Repository fieldAccess=PUBLIC_ACCESS fieldModifier=INSTANCE_VAR,READ_ONLY fieldOrigin=SELF_ASSIGN declaringMethodLinkHash=PY_METHOD_e9a9fd209ad674fca757b55f0d59046a receiverName=self isDeclaredInInit=true writeCount=1 writtenInMethodCount=1 firstWriteLine=28 hasAnnotation=false annotationIsString=false initializerText=store initializerKind=NAME pyModuleLinkHash=PY_MODULE_87ff823ca7cda9220c2fe03210807591 bindingLinkHash= pyExpressionLinkHash=PY_EXPRESSION_761a7f788c9fcafe8fe54d441cd94d55 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_6de6365a260cb8ca2a2f41c13e057e22 +name=tag fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=54 endLine=54 pyTypeLinkHash=PY_TYPE_bd7d395e13e5c973a6e8538aced32fab ownerTypeName=ClassMethodFactory ownerQualifiedName=resolution_edges.ClassMethodFactory fieldAccess=PUBLIC_ACCESS fieldModifier=INSTANCE_VAR,READ_ONLY fieldOrigin=SELF_ASSIGN declaringMethodLinkHash=PY_METHOD_eb5681c8ddcf04929815457a1e598d59 receiverName=self isDeclaredInInit=true writeCount=1 writtenInMethodCount=1 firstWriteLine=54 hasAnnotation=false annotationIsString=false initializerText=tag initializerKind=NAME pyModuleLinkHash=PY_MODULE_daef721b73c8bfbcc0348299f2f7bf9a bindingLinkHash= pyExpressionLinkHash=PY_EXPRESSION_0f7fa5219483899dc1b1880a6f9d494a serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_77575b7f5a7219c8590bc9a37754d3d0 +name=values fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=37 endLine=37 pyTypeLinkHash=PY_TYPE_1e732b162f5deaead4b2e1751fdc8b5f ownerTypeName=InClassBody ownerQualifiedName=comprehension_forms.InClassBody fieldAccess=PUBLIC_ACCESS fieldModifier=CLASS_VAR,READ_ONLY fieldOrigin=CLASS_BODY_ASSIGN declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=37 hasAnnotation=false annotationIsString=false initializerText=[i for i in range(3)] initializerKind=COMPREHENSION pyModuleLinkHash=PY_MODULE_69c6710ffe12b2fc51e03f770319af1b bindingLinkHash=PY_BINDING_086207b12b3601fd4624743e01cd845a pyExpressionLinkHash=PY_EXPRESSION_5d743a1c689a266929bda307ac93ebce serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_0098386942688fc6a884e12e9f6911e3 +name=x fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=22 endLine=22 pyTypeLinkHash=PY_TYPE_834b419437b855738443676b9b3cada0 ownerTypeName=WithSlots ownerQualifiedName=class_forms.WithSlots fieldAccess=PUBLIC_ACCESS fieldModifier=SLOT,INSTANCE_VAR,READ_ONLY fieldOrigin=SLOTS_ENTRY declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=22 hasAnnotation=false annotationIsString=false initializerText= initializerKind=NONE pyModuleLinkHash=PY_MODULE_512fa5aa67cc77834aa18c596c931e59 bindingLinkHash= pyExpressionLinkHash=PY_EXPRESSION_bf49d94b1b5b1d615224bbcede193fd6 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_410e9424d9f85c7f01069a6333206741 +name=x fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=25 endLine=25 pyTypeLinkHash=PY_TYPE_834b419437b855738443676b9b3cada0 ownerTypeName=WithSlots ownerQualifiedName=class_forms.WithSlots fieldAccess=PUBLIC_ACCESS fieldModifier=INSTANCE_VAR,SLOT,READ_ONLY fieldOrigin=SELF_ASSIGN declaringMethodLinkHash=PY_METHOD_1c60534bccbeaabf71d83fbb629164fb receiverName=self isDeclaredInInit=true writeCount=1 writtenInMethodCount=1 firstWriteLine=25 hasAnnotation=false annotationIsString=false initializerText=1 initializerKind=LITERAL pyModuleLinkHash=PY_MODULE_512fa5aa67cc77834aa18c596c931e59 bindingLinkHash= pyExpressionLinkHash=PY_EXPRESSION_0862eff6ff0a1adb1f8aedc4c19d268f serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_23dc9f7e711905b8433e9f2ce8b4811e +name=x fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=10 endLine=10 pyTypeLinkHash=PY_TYPE_6f4e90e4697b76a388566c9bd84e0d4d ownerTypeName=Point ownerQualifiedName=match_class_and_sequence_patterns.Point fieldAccess=PUBLIC_ACCESS fieldModifier=INSTANCE_VAR,READ_ONLY fieldOrigin=SELF_ASSIGN declaringMethodLinkHash=PY_METHOD_ed898c7ba31b1d5a88a7ed47da6a477b receiverName=self isDeclaredInInit=true writeCount=1 writtenInMethodCount=1 firstWriteLine=10 hasAnnotation=false annotationIsString=false initializerText=x initializerKind=NAME pyModuleLinkHash=PY_MODULE_e8c22c801b9d7d33638ace57665fdd49 bindingLinkHash= pyExpressionLinkHash=PY_EXPRESSION_d8d7077f45710e9120c3e6398cc0986e serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_92a0068d85f354f19ad6d582e045d7df +name=x fieldTypeName=int fieldBaseType=int potentialQualifiedName=field_origins.Point.x isAmbiguous=false startLine=19 endLine=19 pyTypeLinkHash=PY_TYPE_6b71a387bb09f3559bd7785e8741463e ownerTypeName=Point ownerQualifiedName=field_origins.Point fieldAccess=PUBLIC_ACCESS fieldModifier=CLASS_VAR,DATACLASS_FIELD,READ_ONLY fieldOrigin=DATACLASS_FIELD declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=19 hasAnnotation=true annotationIsString=false initializerText= initializerKind=NONE pyModuleLinkHash=PY_MODULE_d9b6cd4b9890511117f0581289c3e72e bindingLinkHash=PY_BINDING_faff6556d980286b5caffa3120d0a328 pyExpressionLinkHash=PY_EXPRESSION_d3a3294efad0cccf2cebd3a749b421ca serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_7d18be1a9fe29d0bed13a216fb06f410 +name=y fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=11 endLine=11 pyTypeLinkHash=PY_TYPE_6f4e90e4697b76a388566c9bd84e0d4d ownerTypeName=Point ownerQualifiedName=match_class_and_sequence_patterns.Point fieldAccess=PUBLIC_ACCESS fieldModifier=INSTANCE_VAR,READ_ONLY fieldOrigin=SELF_ASSIGN declaringMethodLinkHash=PY_METHOD_ed898c7ba31b1d5a88a7ed47da6a477b receiverName=self isDeclaredInInit=true writeCount=1 writtenInMethodCount=1 firstWriteLine=11 hasAnnotation=false annotationIsString=false initializerText=y initializerKind=NAME pyModuleLinkHash=PY_MODULE_e8c22c801b9d7d33638ace57665fdd49 bindingLinkHash= pyExpressionLinkHash=PY_EXPRESSION_0b2011f5a35e76274b3622f5fcb378c2 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_39c1e4363707f3951248f99912d45ae9 +name=y fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=22 endLine=22 pyTypeLinkHash=PY_TYPE_834b419437b855738443676b9b3cada0 ownerTypeName=WithSlots ownerQualifiedName=class_forms.WithSlots fieldAccess=PUBLIC_ACCESS fieldModifier=SLOT,INSTANCE_VAR,READ_ONLY fieldOrigin=SLOTS_ENTRY declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=22 hasAnnotation=false annotationIsString=false initializerText= initializerKind=NONE pyModuleLinkHash=PY_MODULE_512fa5aa67cc77834aa18c596c931e59 bindingLinkHash= pyExpressionLinkHash=PY_EXPRESSION_259ffe8cc6332d9477a5ec7ca24bb921 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_11cbc9360f3ced40836b98405f95cda3 +name=y fieldTypeName= fieldBaseType= potentialQualifiedName= isAmbiguous=false startLine=26 endLine=26 pyTypeLinkHash=PY_TYPE_834b419437b855738443676b9b3cada0 ownerTypeName=WithSlots ownerQualifiedName=class_forms.WithSlots fieldAccess=PUBLIC_ACCESS fieldModifier=INSTANCE_VAR,SLOT,READ_ONLY fieldOrigin=SELF_ASSIGN declaringMethodLinkHash=PY_METHOD_1c60534bccbeaabf71d83fbb629164fb receiverName=self isDeclaredInInit=true writeCount=1 writtenInMethodCount=1 firstWriteLine=26 hasAnnotation=false annotationIsString=false initializerText=2 initializerKind=LITERAL pyModuleLinkHash=PY_MODULE_512fa5aa67cc77834aa18c596c931e59 bindingLinkHash= pyExpressionLinkHash=PY_EXPRESSION_341ada2d54c00d80488099254b019ebe serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_0a33242ff4f96e4f7da2aaf37f7390af +name=y fieldTypeName=int fieldBaseType=int potentialQualifiedName=field_origins.Point.y isAmbiguous=false startLine=20 endLine=20 pyTypeLinkHash=PY_TYPE_6b71a387bb09f3559bd7785e8741463e ownerTypeName=Point ownerQualifiedName=field_origins.Point fieldAccess=PUBLIC_ACCESS fieldModifier=CLASS_VAR,DATACLASS_FIELD,READ_ONLY fieldOrigin=DATACLASS_FIELD declaringMethodLinkHash= receiverName= isDeclaredInInit=false writeCount=1 writtenInMethodCount=0 firstWriteLine=20 hasAnnotation=true annotationIsString=false initializerText=0 initializerKind=LITERAL pyModuleLinkHash=PY_MODULE_d9b6cd4b9890511117f0581289c3e72e bindingLinkHash=PY_BINDING_16132b28e5f39ba60433d84427b51e50 pyExpressionLinkHash=PY_EXPRESSION_4c779c40db426accfc5948670ab22620 serviceVersionLinkHash=SERVICE_VERSION_00000000000000000000000000000000 pyFieldUniqueHash=PY_FIELD_54dec3f2ca5dacd7edb5e5868dfee299 diff --git a/parser/src/test/python-gates/field-lines.ts b/parser/src/test/python-gates/field-lines.ts new file mode 100644 index 000000000..3b543f851 --- /dev/null +++ b/parser/src/test/python-gates/field-lines.ts @@ -0,0 +1,117 @@ +/** + * A field row carries the line its write is ON, 1-based like every other Python relation. + * + * The field extractor copied tree-sitter's 0-based `row` straight into `startLine`, + * `endLine` and `firstWriteLine`, while methods, types, comments and blocks all add 1. So + * every field sat one line above its write: the first field of a nested `class Meta:` was + * recorded AT the `class Meta:` line, and a query by `file:line` or a diff hunk on the + * write landed on the field above it, or on nothing. + * + * The frozen golden could not see it: it had frozen the 0-based values. This gate names + * the expected line of each write form, so a wrong value is red even when it is stable. + * + * Near-miss controls: the declaration lines of the classes and of `__init__` must not move + * (they were already 1-based), and no field may sit on a `class` line. + */ +import * as fs from 'fs'; +import * as os from 'os'; +import * as path from 'path'; + +import { PythonProjectAnalyzer } from '@/workflows/python/python-project-analyzer'; + +const SOURCE = `class Form: + name = "form" + + class Meta: + csrf = True + fields = ( + "a", + "b", + ) + + def __init__(self): + self.count = 0 + setattr(self, "dynamic", 1) + + +class Slotted: + __slots__ = ("x",) +`; + +/** field name -> [startLine, endLine] of its (first) write, 1-based. */ +const FIELDS: ReadonlyArray = [ + ['name', 2, 2, 'a top-level class-body assignment'], + ['csrf', 5, 5, 'the first field of a nested class: NOT the `class Meta:` line (4)'], + ['fields', 6, 9, 'a multi-line class-body assignment spans its value'], + ['count', 12, 12, 'self.x = ... in __init__'], + ['dynamic', 13, 13, 'setattr(self, "name", v)'], + ['x', 17, 17, 'a __slots__ entry'], +]; + +/** control: declarations that were already 1-based keep their line. */ +const DECLS: ReadonlyArray = [ + ['all-python-types.csv', 'Form', 1], + ['all-python-types.csv', 'Meta', 4], + ['all-python-types.csv', 'Slotted', 16], + ['all-python-methods.csv', '__init__', 11], +]; + +export async function fieldLines(): Promise { + const problems: string[] = []; + const root = fs.mkdtempSync(path.join(os.tmpdir(), 'py-fieldlines-')); + const source = path.join(root, 'src'); + fs.mkdirSync(source, { recursive: true }); + fs.writeFileSync(path.join(source, 'forms.py'), SOURCE); + + const outputDir = path.join(root, 'out'); + await new PythonProjectAnalyzer().analyze({ + rootDir: source, + outputDir, + baseMservPath: '/repo', + serviceVersionLinkHash: 'SERVICE_VERSION_' + '0'.repeat(32), + }); + + const tsv = (file: string): Record[] => { + const lines = fs.readFileSync(path.join(outputDir, file), 'utf-8').split('\n').filter(Boolean); + const header = lines[0]!.split('\t'); + return lines.slice(1).map((l) => { + const cells = l.split('\t'); + return Object.fromEntries(header.map((h, i) => [h, cells[i] ?? ''])); + }); + }; + + const fields = tsv('all-python-fields.csv'); + for (const [name, start, end, why] of FIELDS) { + const row = fields.find((f) => f.name === name); + if (!row) { + problems.push(`${name} (${why}): no field row`); + continue; + } + const got = [Number(row.startLine), Number(row.endLine), Number(row.firstWriteLine)]; + if (got[0] !== start || got[1] !== end || got[2] !== start) { + problems.push(`${name} (${why}): expected start=${start} end=${end} firstWrite=${start}, ` + + `got start=${got[0]} end=${got[1]} firstWrite=${got[2]}`); + } + } + + const classLines = new Set(); + for (const [file, name, line] of DECLS) { + const row = tsv(file).find((r) => r.name === name); + const got = row ? Number(row.startLine) : NaN; + if (got !== line) problems.push(`control: ${name} in ${file} expected line ${line}, got ${got}`); + if (file === 'all-python-types.csv') classLines.add(line); + } + for (const f of fields) { + if (classLines.has(Number(f.startLine))) { + problems.push(`control: field ${f.name} sits on a class line (${f.startLine})`); + } + } + + fs.rmSync(root, { recursive: true, force: true }); + console.log(` ${FIELDS.length} write forms checked for 1-based lines; ` + + `${DECLS.length} declaration lines and the no-field-on-a-class-line rule as controls`); + for (const problem of problems) { + console.log(` FAIL ${problem}`); + } + return problems.length === 0 ? 0 : 1; +} diff --git a/parser/src/test/python-tests.ts b/parser/src/test/python-tests.ts index db6bc3961..feaf252ad 100644 --- a/parser/src/test/python-tests.ts +++ b/parser/src/test/python-tests.ts @@ -36,6 +36,7 @@ import { softKeywordTypeCall } from './python-gates/soft-keyword-type-call'; import { asyncIteration } from './python-gates/async-iteration'; import { splatCallee } from './python-gates/splat-callee'; import { cachedProperty } from './python-gates/cached-property'; +import { fieldLines } from './python-gates/field-lines'; import { pep604Union } from './python-gates/pep604-union'; const VERIFIED = 'src/test-data/python/verified'; @@ -587,6 +588,8 @@ const CHECKS: Check[] = [ proves: 'a call whose result is splatted is a named static call, not a dynamic one' }, { name: 'cached property', run: cachedProperty, proves: 'a @cached_property is a property getter — a read that runs a body — not a method nobody calls' }, + { name: 'field lines', run: fieldLines, + proves: 'a field row sits on the line of its write, 1-based; never on the class line above it' }, { name: 'PEP 604 unions', run: pep604Union, proves: 'a union is decomposed whatever its operands look like; a subscripted operand does not collapse it' }, { name: 'async iteration', run: asyncIteration, diff --git a/plugins/axiomcode/skills/axiomcode/SKILL.md b/plugins/axiomcode/skills/axiomcode/SKILL.md index 18ea9df5e..2cc15b7d2 100644 --- a/plugins/axiomcode/skills/axiomcode/SKILL.md +++ b/plugins/axiomcode/skills/axiomcode/SKILL.md @@ -95,6 +95,8 @@ and service loaders are invisible. Detail: `reference/changed-and-tests.md`. (with the unresolved sites that might connect them). Endpoints as written: `Owner.method`, `Type`, `file.ts:123`, `'new File'`, `'@GetMapping'`, `'*'`, or a bare word. A misspelt name stops with the close ones. Detail: `reference/path.md`. +A fact no verb prints (decorations, bases, entry points by reason, field writers): `reference/schema.md` names the table per language. + ## What it cannot see — say so instead of guessing Reflection, string dispatch, event buses; receivers the engine could not type; callbacks invoked by a library; diff --git a/plugins/axiomcode/skills/axiomcode/reference/schema.md b/plugins/axiomcode/skills/axiomcode/reference/schema.md new file mode 100644 index 000000000..6fd14df6f --- /dev/null +++ b/plugins/axiomcode/skills/axiomcode/reference/schema.md @@ -0,0 +1,102 @@ +# schema — which table holds X, per language + +Ask a verb first; open the graph only for a fact no verb prints. Every graph holds ONE language, and the same fact +lives in a different table per language. This page says where, for Python, Java and C#, and what is not recorded +at all, so you stop looking. Measured on a Django app, a Spring Boot app and an ASP.NET app, one fresh index each. + +## Which graph + +| | | +|---|---| +| the main language (most files) | `.axiomcode/out/graph.sqlite`, a symlink to `.axiomcode/out//graph.sqlite` | +| every other language | `.axiomcode/lang//out/graph.sqlite` | +| which one you opened | `sqlite3 -readonly "SELECT value FROM run WHERE key='language'"` | +| tested SQL, caveats, value meanings | the `schema_queries`, `schema_notes`, `schema_vocab` tables in the same file | + +Ids are opaque (`PY_METHOD_…`, `METHOD_REGISTRY_…`, `CS_PROPERTY_…`): join on them, never parse them. `symbols` +holds every declaration of every kind with `file`, `line`, `owner`, `is_test`; `symbols.id` is the id the other +tables use, and `symbols.method_id` / `type_id` join it to `methods` / `types`. + +## Fact by language + +| fact | Python | Java | C# | +|---|---|---|---| +| decoration / annotation / attribute | `decorations`; owner is a method or type | `decorations`; owner is a method, type, field or a **parameter** (`METHOD_PARAMETER_…`, joins nothing) | `decorations`; owner is a method, type or property (`CS_PROPERTY_…`) | +| its name and text | `name` = last dotted segment (`@admin.register(X)` → `register`); `text` = as written, args included | `name` as written after `@`; `text` with args, string quotes tripled (`"""/articles"""`) | `name` as written; `text` = `@Name` **only**, even for `[Endpoint(Name = "x")]`: the arguments are in `literals` at the same file:line | +| base types, resolved | `type_ancestors` (transitive) | `type_ancestors`, library bases included as `types.provenance='external'` | `type_ancestors` (transitive) | +| base types, library / unresolved | **not** in `type_ancestors`: `type_refs` `context='BASE_CLASS'` (last segment only, `Model`) and `ext_type_base_unresolved` (c1 = type id, c3 = text, `models.Model`) | as above; also `type_use` `context='SUPER_TYPE'` with `owner_type_id` | **not** in `type_ancestors`: `type_refs` `context='BASE_LIST'` (name without type args); `ext_type_base_unresolved` c3 = name, but c1 is a declaration group, not a `types.id` | +| entry points | `entry_points(method_id, reason)`: `url`, `orm_hook` seen; rules also emit `http`, `task`, `signal_receiver`, `fixture`, `di_provider`, `grpc_service`. **No** `test` or `main` reason | `test`, `http`, `bean_ctor`, `factory`, `main` seen; also `cli`, `queue`, `scheduled`, `lifecycle`, `spring_factories`; config keys in `ext_config_entry_point` | `test`, `http`, `orm_hook`, `framework_hook`, `main` seen; also `queue`, `grpc_service` | +| field declarations | `symbols` `kind='field'` (`PY_FIELD_…`, `owner` `Form` or `Form.Meta`); `fields` is **empty** | `fields` | `fields` = true fields only; a property is `symbols` `kind='field'` with a `CS_PROPERTY_…` id, and its accessors are `methods` `kind` `PROPERTY_GET` / `PROPERTY_SET` / `PROPERTY_INIT` (`get_X`, `set_X`) | +| who writes / reads a field | **not recorded**: `field_access` is empty; `refs` `ATTRIBUTE_ACCESS` / `FIELD` is every mention by name and line, read and write alike, with no field id | `field_access` (`access` read / write, `tier`, `caller_id`) | property: `call_edges` `kind` `property_write` / `property_read` to the accessor. Field: **not recorded** (`field_access` empty; `refs` `NAME_REFERENCE` / `FIELD` by name) | +| call edges | `call_edges`; tiers `known_edge`, `multi_inferred`, `boundary_lib`, `ambiguous_unknown`; kinds `METHOD_CALL`, `SELF_CALL`, `DECORATOR_*`, `PROPERTY_READ`, … | tiers add `ambiguous_anon`; kinds `method`, `new`, `anon_new`, `ctor_delegate`, `ref` | tiers add `known_builtin_operator`, `known_implicit_ctor`; kinds add `property_read`/`_write`, `operator`, `conversion`, `indexer`, `delegate` | +| why a call is unresolved | `ext_call_site_unresolved` (c0 site, c1 caller, c2 reason, c3 call kind) | `unresolved_sites` only, no reason | `ext_site_unresolved_named` (c0 site, c1 receiver type or ``, c2 name) | +| strings in source | `literals(value, file, line)` | `literals`; config keys: `ext_config_binding` (key, mechanism, target kind, target id, owner), `ext_config_class_ref` | `literals` | +| text outside the source (XML, YAML, SQL, …) | **not in the graph**: scanned per query, cached in `.axiomcode/out/dl/nonsource.sqlite` (`files(id, rel)`, `tok(tok, fid)`) | same | same | +| tests | `symbols.is_test` (by file path); no test entry point | `is_test` + `entry_points` `reason='test'` | `is_test` + `entry_points` `reason='test'` | +| test rungs (`[sound]`, `[fixture]`, `[at import]`, …) | **not stored**: computed per query | same | same | + +`field_access`, `type_use` and `type_instantiated` are empty in some languages (`type_use` in Python and C#, +`type_instantiated` in C#): run `SELECT count(*)` before reading an empty answer as "nothing". `overrides` is empty +in Python: its dispatch set is `dispatch_candidates` (basis `mro`). + +## The verb for each fact + +| fact | verb | +|---|---| +| methods carrying a decoration | `path '@login_required' '*'` (or `'@GetMapping'`): the decorated methods and what they reach | +| subtypes of a type | `impact `: "must change with it" | +| who writes a Java field | `impact .`: "produces or writes it" | +| who writes a C# property | `impact :`: answers through its accessors. `impact Type.Prop` and `Type._field` find nothing in C# on this build (the symbols carry no owner): fall back to the SQL below | +| a Python field | `impact .` lists readers `[in scope]` / `[by name]` only; there is no writer section, because no writer relation exists | +| text files naming a declaration | `impact X`: "bound from outside the source"; `context ""`: "text files that name these" | +| a config key or a quoted string | `impact app.cache.ttl` · `impact '"some-string"'` | +| test rungs and routes | `impact X --tests-only --why` · `test-impact --why` | +| entry points by reason | no verb: SQL below | + +## Queries + +```sh +G=.axiomcode/out/graph.sqlite +# [all] decorations, with the owner whatever its kind (a Java parameter's owner comes back NULL) +sqlite3 -readonly $G "SELECT d.text, s.kind, s.qualified_name, d.file, d.line FROM decorations d + LEFT JOIN symbols s ON s.id = d.owner_id WHERE d.name = 'GetMapping'" +# [all] entry points by reason, then one reason's methods +sqlite3 -readonly $G "SELECT reason, count(*) FROM entry_points GROUP BY 1" +sqlite3 -readonly $G "SELECT m.qualified_name, m.file_path, m.start_line FROM entry_points e + JOIN methods m ON m.id = e.method_id WHERE e.reason = 'http'" +# [all] resolved ancestors (Java: library ones too, provenance 'external') +sqlite3 -readonly $G "SELECT a.qualified_name, a.provenance FROM type_ancestors x JOIN types t ON t.id = x.type_id + JOIN types a ON a.id = x.ancestor_type_id WHERE t.name = ''" +# [python] library bases, full text as written +sqlite3 -readonly $G "SELECT t.qualified_name, u.c3 FROM ext_type_base_unresolved u JOIN types t ON t.id = u.c1" +# [csharp] library bases: the owner is the innermost type whose span holds the base-list line +sqlite3 -readonly $G "SELECT r.name, (SELECT t.qualified_name FROM types t WHERE t.file_path = r.file + AND r.line BETWEEN t.start_line AND t.end_line ORDER BY t.start_line DESC LIMIT 1) AS owner + FROM type_refs r WHERE r.context = 'BASE_LIST'" +# [java] field writers +sqlite3 -readonly $G "SELECT m.qualified_name, a.file_path, a.start_line, a.tier FROM field_access a + JOIN fields f ON f.id = a.field_id JOIN methods m ON m.id = a.caller_id + WHERE f.owner_qualified_name LIKE '%.' AND f.name = '' AND a.access = 'write'" +# [csharp] property writers (property_read for readers) +sqlite3 -readonly $G "SELECT c.qualified_name, s.file_path, s.start_line FROM call_edges e + JOIN methods t ON t.id = e.callee_method_id JOIN methods c ON c.id = e.caller_id + JOIN call_sites s ON s.id = e.call_site_id WHERE e.kind = 'property_write' AND t.name = 'set_'" +# [all] tiers in this graph; [python] what the unresolved sites are waiting on +sqlite3 -readonly $G "SELECT tier, count(*) FROM call_edges GROUP BY 1" +sqlite3 -readonly $G "SELECT c2, count(*) FROM ext_call_site_unresolved GROUP BY 1 ORDER BY 2 DESC" +``` + +## Traps + +- **Paths.** Java `methods`, `types`, `fields`, `call_sites` and `field_access` hold ABSOLUTE paths; its `symbols`, + `decorations` and `type_refs` hold repo-relative ones, as every Python and C# table does. Match Java with + `LIKE '%/rel/path.java'`. +- **Lines.** Java `type_refs` rows carry `line = 0` in every context but the two annotation ones: locate a Java + base through `type_use` or the type. A C# `BASE_LIST` line is where the base list is written, which is below + `types.start_line` when attributes or a line break come first: join by span, not by equal line. In a graph built + before the field-line fix, every Python field line is one early (0-based): a nested class's first field sits on + its `class Meta:` line. +- **Names.** Python `type_refs` and `decorations` keep only the last dotted segment; the full text is in + `ext_type_base_unresolved.c3` and `decorations.text`. String cells are CSV-escaped: match with `LIKE '%x%'`. +- **`ext_*` tables** have positional columns `c0…cN`; `SELECT description FROM schema_tables WHERE name = ''` + names them. diff --git a/skills/axiomcode/SKILL.md b/skills/axiomcode/SKILL.md index 3e981cbeb..e7da7e45b 100644 --- a/skills/axiomcode/SKILL.md +++ b/skills/axiomcode/SKILL.md @@ -95,6 +95,8 @@ and service loaders are invisible. Detail: `reference/changed-and-tests.md`. (with the unresolved sites that might connect them). Endpoints as written: `Owner.method`, `Type`, `file.ts:123`, `'new File'`, `'@GetMapping'`, `'*'`, or a bare word. A misspelt name stops with the close ones. Detail: `reference/path.md`. +A fact no verb prints (decorations, bases, entry points by reason, field writers): `reference/schema.md` names the table per language. + ## What it cannot see — say so instead of guessing Reflection, string dispatch, event buses; receivers the engine could not type; callbacks invoked by a library; diff --git a/skills/axiomcode/reference/schema.md b/skills/axiomcode/reference/schema.md new file mode 100644 index 000000000..6fd14df6f --- /dev/null +++ b/skills/axiomcode/reference/schema.md @@ -0,0 +1,102 @@ +# schema — which table holds X, per language + +Ask a verb first; open the graph only for a fact no verb prints. Every graph holds ONE language, and the same fact +lives in a different table per language. This page says where, for Python, Java and C#, and what is not recorded +at all, so you stop looking. Measured on a Django app, a Spring Boot app and an ASP.NET app, one fresh index each. + +## Which graph + +| | | +|---|---| +| the main language (most files) | `.axiomcode/out/graph.sqlite`, a symlink to `.axiomcode/out//graph.sqlite` | +| every other language | `.axiomcode/lang//out/graph.sqlite` | +| which one you opened | `sqlite3 -readonly "SELECT value FROM run WHERE key='language'"` | +| tested SQL, caveats, value meanings | the `schema_queries`, `schema_notes`, `schema_vocab` tables in the same file | + +Ids are opaque (`PY_METHOD_…`, `METHOD_REGISTRY_…`, `CS_PROPERTY_…`): join on them, never parse them. `symbols` +holds every declaration of every kind with `file`, `line`, `owner`, `is_test`; `symbols.id` is the id the other +tables use, and `symbols.method_id` / `type_id` join it to `methods` / `types`. + +## Fact by language + +| fact | Python | Java | C# | +|---|---|---|---| +| decoration / annotation / attribute | `decorations`; owner is a method or type | `decorations`; owner is a method, type, field or a **parameter** (`METHOD_PARAMETER_…`, joins nothing) | `decorations`; owner is a method, type or property (`CS_PROPERTY_…`) | +| its name and text | `name` = last dotted segment (`@admin.register(X)` → `register`); `text` = as written, args included | `name` as written after `@`; `text` with args, string quotes tripled (`"""/articles"""`) | `name` as written; `text` = `@Name` **only**, even for `[Endpoint(Name = "x")]`: the arguments are in `literals` at the same file:line | +| base types, resolved | `type_ancestors` (transitive) | `type_ancestors`, library bases included as `types.provenance='external'` | `type_ancestors` (transitive) | +| base types, library / unresolved | **not** in `type_ancestors`: `type_refs` `context='BASE_CLASS'` (last segment only, `Model`) and `ext_type_base_unresolved` (c1 = type id, c3 = text, `models.Model`) | as above; also `type_use` `context='SUPER_TYPE'` with `owner_type_id` | **not** in `type_ancestors`: `type_refs` `context='BASE_LIST'` (name without type args); `ext_type_base_unresolved` c3 = name, but c1 is a declaration group, not a `types.id` | +| entry points | `entry_points(method_id, reason)`: `url`, `orm_hook` seen; rules also emit `http`, `task`, `signal_receiver`, `fixture`, `di_provider`, `grpc_service`. **No** `test` or `main` reason | `test`, `http`, `bean_ctor`, `factory`, `main` seen; also `cli`, `queue`, `scheduled`, `lifecycle`, `spring_factories`; config keys in `ext_config_entry_point` | `test`, `http`, `orm_hook`, `framework_hook`, `main` seen; also `queue`, `grpc_service` | +| field declarations | `symbols` `kind='field'` (`PY_FIELD_…`, `owner` `Form` or `Form.Meta`); `fields` is **empty** | `fields` | `fields` = true fields only; a property is `symbols` `kind='field'` with a `CS_PROPERTY_…` id, and its accessors are `methods` `kind` `PROPERTY_GET` / `PROPERTY_SET` / `PROPERTY_INIT` (`get_X`, `set_X`) | +| who writes / reads a field | **not recorded**: `field_access` is empty; `refs` `ATTRIBUTE_ACCESS` / `FIELD` is every mention by name and line, read and write alike, with no field id | `field_access` (`access` read / write, `tier`, `caller_id`) | property: `call_edges` `kind` `property_write` / `property_read` to the accessor. Field: **not recorded** (`field_access` empty; `refs` `NAME_REFERENCE` / `FIELD` by name) | +| call edges | `call_edges`; tiers `known_edge`, `multi_inferred`, `boundary_lib`, `ambiguous_unknown`; kinds `METHOD_CALL`, `SELF_CALL`, `DECORATOR_*`, `PROPERTY_READ`, … | tiers add `ambiguous_anon`; kinds `method`, `new`, `anon_new`, `ctor_delegate`, `ref` | tiers add `known_builtin_operator`, `known_implicit_ctor`; kinds add `property_read`/`_write`, `operator`, `conversion`, `indexer`, `delegate` | +| why a call is unresolved | `ext_call_site_unresolved` (c0 site, c1 caller, c2 reason, c3 call kind) | `unresolved_sites` only, no reason | `ext_site_unresolved_named` (c0 site, c1 receiver type or ``, c2 name) | +| strings in source | `literals(value, file, line)` | `literals`; config keys: `ext_config_binding` (key, mechanism, target kind, target id, owner), `ext_config_class_ref` | `literals` | +| text outside the source (XML, YAML, SQL, …) | **not in the graph**: scanned per query, cached in `.axiomcode/out/dl/nonsource.sqlite` (`files(id, rel)`, `tok(tok, fid)`) | same | same | +| tests | `symbols.is_test` (by file path); no test entry point | `is_test` + `entry_points` `reason='test'` | `is_test` + `entry_points` `reason='test'` | +| test rungs (`[sound]`, `[fixture]`, `[at import]`, …) | **not stored**: computed per query | same | same | + +`field_access`, `type_use` and `type_instantiated` are empty in some languages (`type_use` in Python and C#, +`type_instantiated` in C#): run `SELECT count(*)` before reading an empty answer as "nothing". `overrides` is empty +in Python: its dispatch set is `dispatch_candidates` (basis `mro`). + +## The verb for each fact + +| fact | verb | +|---|---| +| methods carrying a decoration | `path '@login_required' '*'` (or `'@GetMapping'`): the decorated methods and what they reach | +| subtypes of a type | `impact `: "must change with it" | +| who writes a Java field | `impact .`: "produces or writes it" | +| who writes a C# property | `impact :`: answers through its accessors. `impact Type.Prop` and `Type._field` find nothing in C# on this build (the symbols carry no owner): fall back to the SQL below | +| a Python field | `impact .` lists readers `[in scope]` / `[by name]` only; there is no writer section, because no writer relation exists | +| text files naming a declaration | `impact X`: "bound from outside the source"; `context ""`: "text files that name these" | +| a config key or a quoted string | `impact app.cache.ttl` · `impact '"some-string"'` | +| test rungs and routes | `impact X --tests-only --why` · `test-impact --why` | +| entry points by reason | no verb: SQL below | + +## Queries + +```sh +G=.axiomcode/out/graph.sqlite +# [all] decorations, with the owner whatever its kind (a Java parameter's owner comes back NULL) +sqlite3 -readonly $G "SELECT d.text, s.kind, s.qualified_name, d.file, d.line FROM decorations d + LEFT JOIN symbols s ON s.id = d.owner_id WHERE d.name = 'GetMapping'" +# [all] entry points by reason, then one reason's methods +sqlite3 -readonly $G "SELECT reason, count(*) FROM entry_points GROUP BY 1" +sqlite3 -readonly $G "SELECT m.qualified_name, m.file_path, m.start_line FROM entry_points e + JOIN methods m ON m.id = e.method_id WHERE e.reason = 'http'" +# [all] resolved ancestors (Java: library ones too, provenance 'external') +sqlite3 -readonly $G "SELECT a.qualified_name, a.provenance FROM type_ancestors x JOIN types t ON t.id = x.type_id + JOIN types a ON a.id = x.ancestor_type_id WHERE t.name = ''" +# [python] library bases, full text as written +sqlite3 -readonly $G "SELECT t.qualified_name, u.c3 FROM ext_type_base_unresolved u JOIN types t ON t.id = u.c1" +# [csharp] library bases: the owner is the innermost type whose span holds the base-list line +sqlite3 -readonly $G "SELECT r.name, (SELECT t.qualified_name FROM types t WHERE t.file_path = r.file + AND r.line BETWEEN t.start_line AND t.end_line ORDER BY t.start_line DESC LIMIT 1) AS owner + FROM type_refs r WHERE r.context = 'BASE_LIST'" +# [java] field writers +sqlite3 -readonly $G "SELECT m.qualified_name, a.file_path, a.start_line, a.tier FROM field_access a + JOIN fields f ON f.id = a.field_id JOIN methods m ON m.id = a.caller_id + WHERE f.owner_qualified_name LIKE '%.' AND f.name = '' AND a.access = 'write'" +# [csharp] property writers (property_read for readers) +sqlite3 -readonly $G "SELECT c.qualified_name, s.file_path, s.start_line FROM call_edges e + JOIN methods t ON t.id = e.callee_method_id JOIN methods c ON c.id = e.caller_id + JOIN call_sites s ON s.id = e.call_site_id WHERE e.kind = 'property_write' AND t.name = 'set_'" +# [all] tiers in this graph; [python] what the unresolved sites are waiting on +sqlite3 -readonly $G "SELECT tier, count(*) FROM call_edges GROUP BY 1" +sqlite3 -readonly $G "SELECT c2, count(*) FROM ext_call_site_unresolved GROUP BY 1 ORDER BY 2 DESC" +``` + +## Traps + +- **Paths.** Java `methods`, `types`, `fields`, `call_sites` and `field_access` hold ABSOLUTE paths; its `symbols`, + `decorations` and `type_refs` hold repo-relative ones, as every Python and C# table does. Match Java with + `LIKE '%/rel/path.java'`. +- **Lines.** Java `type_refs` rows carry `line = 0` in every context but the two annotation ones: locate a Java + base through `type_use` or the type. A C# `BASE_LIST` line is where the base list is written, which is below + `types.start_line` when attributes or a line break come first: join by span, not by equal line. In a graph built + before the field-line fix, every Python field line is one early (0-based): a nested class's first field sits on + its `class Meta:` line. +- **Names.** Python `type_refs` and `decorations` keep only the last dotted segment; the full text is in + `ext_type_base_unresolved.c3` and `decorations.text`. String cells are CSV-escaped: match with `LIKE '%x%'`. +- **`ext_*` tables** have positional columns `c0…cN`; `SELECT description FROM schema_tables WHERE name = ''` + names them.