[{"data":1,"prerenderedAt":1238},["ShallowReactive",2],{"navigation":3,"\u002Fdocs\u002Fjava":135,"\u002Fdocs\u002Fjava-surround":1233},[4],{"title":5,"path":6,"stem":7,"children":8,"page":134},"Docs","\u002Fdocs","docs",[9,13,17,21,25,29,33,37,41,45,49,53,57,61,70,74,78,82,86,90,94,98,102,106,110,114,118,122,126,130],{"title":10,"path":11,"stem":12},"AI harnesses: LLM tools, MCP servers and agents","\u002Fdocs\u002Fai-tools","docs\u002Fai-tools",{"title":14,"path":15,"stem":16},"Architecture","\u002Fdocs\u002Farchitecture","docs\u002Farchitecture",{"title":18,"path":19,"stem":20},"Web \u002F native bridges","\u002Fdocs\u002Fbridges","docs\u002Fbridges",{"title":22,"path":23,"stem":24},"Broadcast channels and tests","\u002Fdocs\u002Fchannels-and-tests","docs\u002Fchannels-and-tests",{"title":26,"path":27,"stem":28},"CLI reference","\u002Fdocs\u002Fcli","docs\u002Fcli",{"title":30,"path":31,"stem":32},"Completeness: how far an answer reaches","\u002Fdocs\u002Fcompleteness","docs\u002Fcompleteness",{"title":34,"path":35,"stem":36},"Configuration","\u002Fdocs\u002Fconfiguration","docs\u002Fconfiguration",{"title":38,"path":39,"stem":40},"External systems","\u002Fdocs\u002Fexternal","docs\u002Fexternal",{"title":42,"path":43,"stem":44},"Generated, copied and vendored files","\u002Fdocs\u002Fgenerated","docs\u002Fgenerated",{"title":46,"path":47,"stem":48},"Installing and updating cg","\u002Fdocs\u002Finstall","docs\u002Finstall",{"title":50,"path":51,"stem":52},"Java","\u002Fdocs\u002Fjava","docs\u002Fjava",{"title":54,"path":55,"stem":56},"Kotlin","\u002Fdocs\u002Fkotlin","docs\u002Fkotlin",{"title":58,"path":59,"stem":60},"Known limitations","\u002Fdocs\u002Flimitations","docs\u002Flimitations",{"title":62,"path":63,"stem":64,"children":65},"MCP server","\u002Fdocs\u002Fmcp","docs\u002Fmcp",[66],{"title":67,"path":68,"stem":69},"code-graph MCP: sample outputs (real calls via the MCP Python SDK stdio client)","\u002Fdocs\u002Fmcp\u002Fsample_outputs","docs\u002Fmcp\u002Fsample_outputs",{"title":71,"path":72,"stem":73},"Rust, C and C++","\u002Fdocs\u002Fnative","docs\u002Fnative",{"title":75,"path":76,"stem":77},"Port gaps: cg parity","\u002Fdocs\u002Fparity","docs\u002Fparity",{"title":79,"path":80,"stem":81},"PHP","\u002Fdocs\u002Fphp","docs\u002Fphp",{"title":83,"path":84,"stem":85},"Planned changes","\u002Fdocs\u002Fplans","docs\u002Fplans",{"title":87,"path":88,"stem":89},"Platform-specific code","\u002Fdocs\u002Fplatforms","docs\u002Fplatforms",{"title":91,"path":92,"stem":93},"Protocol links","\u002Fdocs\u002Fprotocols","docs\u002Fprotocols",{"title":95,"path":96,"stem":97},"Python","\u002Fdocs\u002Fpython","docs\u002Fpython",{"title":99,"path":100,"stem":101},"Quick start","\u002Fdocs\u002Fquickstart","docs\u002Fquickstart",{"title":103,"path":104,"stem":105},"Graph schema","\u002Fdocs\u002Fschema","docs\u002Fschema",{"title":107,"path":108,"stem":109},"Attack surface","\u002Fdocs\u002Fsurface","docs\u002Fsurface",{"title":111,"path":112,"stem":113},"Swift","\u002Fdocs\u002Fswift","docs\u002Fswift",{"title":115,"path":116,"stem":117},"TypeScript \u002F JavaScript frameworks","\u002Fdocs\u002Fts-frameworks","docs\u002Fts-frameworks",{"title":119,"path":120,"stem":121},"How we validate","\u002Fdocs\u002Fvalidation","docs\u002Fvalidation",{"title":123,"path":124,"stem":125},"Validation log","\u002Fdocs\u002Fvalidation-log","docs\u002Fvalidation-log",{"title":127,"path":128,"stem":129},"Value facts and resolutions","\u002Fdocs\u002Fvalue-facts","docs\u002Fvalue-facts",{"title":131,"path":132,"stem":133},"Visual view","\u002Fdocs\u002Fviz","docs\u002Fviz",false,{"id":136,"title":50,"body":137,"description":1227,"extension":1228,"meta":1229,"navigation":1230,"path":51,"seo":1231,"stem":52,"__hash__":1232},"docs\u002Fdocs\u002Fjava.md",{"type":138,"value":139,"toc":1216},"minimark",[140,170,175,219,237,244,248,365,371,394,401,470,512,516,527,542,620,690,694,697,754,757,775,779,819,1143,1146,1150],[141,142,143,144,148,149,153,154,158,159,161,162,165,166,169],"p",{},"What ",[145,146,147],"code",{},".java"," adds beyond ",[150,151,152],"a",{"href":47},"Install",", ",[150,155,157],{"href":156},"\u002Fdocs\u002Fcli#query-targets-specs","CLI specs",", and ",[150,160,103],{"href":104},": the heuristic syntax layer and the ids those pages do not spell out. Toolchain fit: ",[145,163,164],{},"cg doctor",". Why a file stayed heuristic: ",[145,167,168],{},"cg coverage",".",[171,172,174],"h2",{"id":173},"modes","Modes",[176,177,178,194],"table",{},[179,180,181],"thead",{},[182,183,184,188,191],"tr",{},[185,186,187],"th",{},"mode",[185,189,190],{},"calls",[185,192,193],{},"needs",[195,196,197],"tbody",{},[182,198,199,203,209],{},[200,201,202],"td",{},"heuristic (default)",[200,204,205,206],{},"receiver type, imports, same package, then a unique name. Labelled ",[145,207,208],{},"heuristic",[200,210,211,212,153,215,218],{},"tree-sitter (",[145,213,214],{},"tree-sitter",[145,216,217],{},"tree-sitter-java","). No JDK",[141,220,221,224,225,228,229,232,233,236],{},[145,222,223],{},"--min-confidence resolved"," (or ",[145,226,227],{},"exact",") hides those call edges. Gradle ",[145,230,231],{},"build\u002F",", Maven ",[145,234,235],{},"target\u002F",", and IDE folders are skipped.",[141,238,239,240,243],{},"A file that is not valid UTF-8 is read as Latin-1 and still indexed. A syntax error is recorded on ",[145,241,242],{},"cg coverage --details"," and does not drop the rest of the project. Declarations inside the error span may be missing; that affects answers whose nodes sit in that file.",[171,245,247],{"id":246},"what-is-extracted","What is extracted",[176,249,250,260],{},[179,251,252],{},[182,253,254,257],{},[185,255,256],{},"node",[185,258,259],{},"id",[195,261,262,272,282,297,307,325,335,345,355],{},[182,263,264,267],{},[200,265,266],{},"file",[200,268,269],{},[145,270,271],{},"file:java:\u003Cpath>",[182,273,274,277],{},[200,275,276],{},"package",[200,278,279],{},[145,280,281],{},"package:com.example",[182,283,284,287],{},[200,285,286],{},"class, interface, enum, record",[200,288,289,292,293,296],{},[145,290,291],{},"class:com.example.Foo"," (",[145,294,295],{},"attrs.java_kind",")",[182,298,299,302],{},[200,300,301],{},"nested type",[200,303,304],{},[145,305,306],{},"class:com.example.Foo.Bar",[182,308,309,312],{},[200,310,311],{},"anonymous class",[200,313,314,224,317,320,321,324],{},[145,315,316],{},"class:com.example.Foo.1",[145,318,319],{},"Foo.place.1"," when the ",[145,322,323],{},"new"," sits in a method)",[182,326,327,330],{},[200,328,329],{},"method",[200,331,332],{},[145,333,334],{},"method:com.example.Foo.bar",[182,336,337,340],{},[200,338,339],{},"constructor",[200,341,342],{},[145,343,344],{},"constructor:com.example.Foo.\u003Cinit>",[182,346,347,350],{},[200,348,349],{},"field",[200,351,352],{},[145,353,354],{},"field:com.example.Foo.name",[182,356,357,360],{},[200,358,359],{},"enum constant",[200,361,362],{},[145,363,364],{},"enum_case:com.example.Color.RED",[141,366,367,368,169],{},"Overloads share one method id, the same way Kotlin does, so a later exact layer can map a scip-java symbol onto it. Nested types use dots, not ",[145,369,370],{},"$",[141,372,373,376,377,380,381,384,385,380,388,391,392,169],{},[145,374,375],{},"CONTAINS"," links a package to its types and a type to its members, fields, and enum constants. ",[145,378,379],{},"EXTENDS"," \u002F ",[145,382,383],{},"IMPLEMENTS"," link a type to a project supertype. ",[145,386,387],{},"IMPLEMENTED_BY",[145,389,390],{},"OVERRIDDEN_BY"," link a method to the method that implements or overrides it. Every one of those edges is ",[145,393,208],{},[141,395,396,397,400],{},"Calls (",[145,398,399],{},"CALLS",") bind in this order:",[402,403,404,419,439,453,456,459],"ol",{},[405,406,407,408,411,412,415,416,169],"li",{},"Receiver type: a local, a parameter, a field, ",[145,409,410],{},"this",", or ",[145,413,414],{},"super",", including ",[145,417,418],{},"this.field.method()",[405,420,421,422,153,425,153,428,431,432,380,435,438],{},"A chain whose type is known: ",[145,423,424],{},"a.b().c()",[145,426,427],{},"p.child().line()",[145,429,430],{},"new Foo().bar()",". The return type (or the constructed type) has to be one project class, and every overload of ",[145,433,434],{},"b",[145,436,437],{},"child"," has to agree on it.",[405,440,441,442,445,446,449,450,169],{},"A static call ",[145,443,444],{},"Foo.bar()"," when ",[145,447,448],{},"Foo"," is in scope, including a qualified name ",[145,451,452],{},"com.example.Foo.bar()",[405,454,455],{},"An explicit import, a wildcard import, or a static import.",[405,457,458],{},"The same package.",[405,460,461,462,465,466,469],{},"One project method of that name. Two to five are ",[145,463,464],{},"candidate"," edges. A receiver whose type is known and is not a project class (",[145,467,468],{},"java.util.Collections.emptyList()",", a primitive) is not guessed by name. A parameter or chain typed as an interface edges that interface method, not each implementing class.",[141,471,472,475,476,479,480,482,483,486,487,153,490,153,493,496,497,500,501,475,504,507,508,511],{},[145,473,474],{},"new Foo()"," is ",[145,477,478],{},"INSTANTIATES"," plus ",[145,481,399],{}," on ",[145,484,485],{},"constructor:….Foo.\u003Cinit>",". A method reference ",[145,488,489],{},"Foo::bar",[145,491,492],{},"this::bar",[145,494,495],{},"expr::bar"," (from ",[145,498,499],{},"expr","'s type), or ",[145,502,503],{},"Foo::new",[145,505,506],{},"REFERENCES_FN"," when the target is in the project. A lambda's calls stay on the enclosing method. An explicitly typed lambda parameter (",[145,509,510],{},"(Pricing x) -> x.line()",") is a receiver type; an inferred one is not.",[171,513,515],{"id":514},"exact-mode","Exact mode",[141,517,518,519,522,523,526],{},"Opt-in, because it runs the build. scip-java runs Gradle ",[145,520,521],{},"clean compileTestJava compileTestKotlin compileTestKotlinJvm"," or Maven ",[145,524,525],{},"clean verify -DskipTests",", and its own docs warn that this cleans build caches. The JDK that runs the build must be 17, 21, or 25. Java 8 and 11 are unsupported build JDKs. A JDK older than 17 cannot start scip-java.",[141,528,529,530,533,534,537,538,541],{},"One scip-java run per project root is cached (",[145,531,532],{},"~\u002F.cache\u002Fcg\u002Fscip","; ",[145,535,536],{},"CG_NO_CACHE=1"," forces a run; ",[145,539,540],{},"CG_INDEXER_TIMEOUT"," caps it). The Java and Kotlin plugins both read that index.",[176,543,544,554],{},[179,545,546],{},[182,547,548,551],{},[185,549,550],{},"source",[185,552,553],{},"when it is used",[195,555,556,576,590,602],{},[182,557,558,563],{},[200,559,560],{},[145,561,562],{},"--scip FILE",[200,564,565,566,568,569,380,572,575],{},"documents include ",[145,567,147],{}," (this plugin) or ",[145,570,571],{},".kt",[145,573,574],{},".kts"," (the Kotlin plugin). A mixed index is used by both. Go and other languages still use the generic importer",[182,577,578,583],{},[200,579,580],{},[145,581,582],{},"CG_JAVA_SCIP_FILE",[200,584,585,586,589],{},"a prebuilt index. Wins over ",[145,587,588],{},"CG_KOTLIN_SCIP_FILE"," when both are set",[182,591,592,596],{},[200,593,594],{},[145,595,588],{},[200,597,598,599,601],{},"the same prebuilt index, when ",[145,600,582],{}," is unset",[182,603,604,613],{},[200,605,606,609,610],{},[145,607,608],{},"CG_JAVA_SCIP=1"," or ",[145,611,612],{},"CG_KOTLIN_SCIP=1",[200,614,615,616,619],{},"either name starts the one run. ",[145,617,618],{},"CG_KOTLIN_SCIP"," keeps working for Kotlin-only trees",[141,621,622,623,626,627,630,631,609,634,637,638,641,642,645,646,648,649,651,652,655,656,658,659,153,662,153,665,153,668,158,671,380,674,380,677,680,681,683,684,687,688,169],{},"Symbols map onto the ids in ",[150,624,247],{"href":625},"#what-is-extracted",": packages, nested classes, anonymous classes (",[145,628,629],{},"$anon"," becomes ",[145,632,633],{},"Foo.1",[145,635,636],{},"Foo.method.1","), enum cases, constructors ",[145,639,640],{},"\u003Cinit>",", fields, and generic methods. Overload disambiguators (",[145,643,644],{},"add(+1)",") collapse onto the shared method id. Exact ",[145,647,399],{},", constructor ",[145,650,478],{},", and field ",[145,653,654],{},"REFERENCES"," replace the heuristic call edges in files the index covers. A file the index misses stays heuristic, and ",[145,657,168],{}," says how many. From Java, ",[145,660,661],{},"FooKt.bar()",[145,663,664],{},"@file:JvmName",[145,666,667],{},"Foo.Companion.x()",[145,669,670],{},"@JvmStatic",[145,672,673],{},"getX",[145,675,676],{},"isX",[145,678,679],{},"setX"," map to the Kotlin node. ",[145,682,164],{},"'s java row names scip-java, the JDK, and the opt-in: ",[145,685,686],{},"install.sh --with java",", then ",[145,689,608],{},[171,691,693],{"id":692},"kotlin-interop","Kotlin interop",[141,695,696],{},"Heuristic mode resolves calls across the two plugins:",[698,699,700,714],"ul",{},[405,701,702,703,445,706,709,710,713],{},"Kotlin → Java through an import or the same package (",[145,704,705],{},"orders.find(id)",[145,707,708],{},"orders"," is a Java ",[145,711,712],{},"OrderService",").",[405,715,716,717,719,720,533,723,533,725,727,728,533,731,380,734,380,737,740,741,380,744,609,747,749,750,753],{},"Java → Kotlin: ",[145,718,661],{}," for a top-level function, including ",[145,721,722],{},"@file:JvmName(\"Foo\")",[145,724,667],{},[145,726,670],{}," called as ",[145,729,730],{},"Foo.x()",[145,732,733],{},"getX()",[145,735,736],{},"setX()",[145,738,739],{},"isX()"," on a Kotlin property, as ",[145,742,743],{},"READS_PROP",[145,745,746],{},"WRITES_PROP",[145,748,399],{}," with ",[145,751,752],{},"property: read|write",", the same edges the Kotlin layer uses.",[141,755,756],{},"Exact mode maps the Java documents of the shared index onto these ids, including fields. The Kotlin layer does not create a second node for the same Java symbol.",[141,758,759,760,153,763,766,767,770,771,774],{},"In ",[145,761,762],{},"examples\u002Fbookstore-spring",[145,764,765],{},"OrderEvents.onPlaced"," calls Java ",[145,768,769],{},"OrderService.place",", so ",[145,772,773],{},"cg impact table:store_books"," lists the Kotlin listener.",[171,776,778],{"id":777},"spring","Spring",[141,780,781,784,785,788,789,791,792,609,795,798,799,153,802,411,805,808,809,812,813,815,816,169],{},[145,782,783],{},"cg_code_graph\u002Fplugins\u002Fjvm\u002Fspring.py"," reads Java and Kotlin declarations (annotations with arguments, parameter types, supertypes, string-literal call arguments) and emits one set of Spring facts. A Java ",[145,786,787],{},"SecurityFilterChain"," bean guards Kotlin controllers, and a Kotlin ",[145,790,787],{}," guards Java controllers. Detection (",[145,793,794],{},"org.springframework.boot",[145,796,797],{},"spring-boot-starter-*"," in ",[145,800,801],{},"build.gradle",[145,803,804],{},"build.gradle.kts",[145,806,807],{},"pom.xml"," at the project root or one module down) applies ",[145,810,811],{},"presets\u002Fspring.yaml",". ",[145,814,168],{}," then reports ",[145,817,818],{},"frameworks: spring",[176,820,821,831],{},[179,822,823],{},[182,824,825,828],{},[185,826,827],{},"fact",[185,829,830],{},"what is recorded",[195,832,833,895,952,998,1031,1072,1117],{},[182,834,835,838],{},[200,836,837],{},"Routes",[200,839,840,841,380,844,380,847,380,850,380,853,380,856,859,860,862,863,866,867,870,871,630,874,812,877,880,881,609,884,887,888,380,891,894],{},"Class and method ",[145,842,843],{},"@RequestMapping",[145,845,846],{},"@GetMapping",[145,848,849],{},"@PostMapping",[145,851,852],{},"@PutMapping",[145,854,855],{},"@DeleteMapping",[145,857,858],{},"@PatchMapping",". A bare ",[145,861,846],{}," keeps the class prefix (",[145,864,865],{},"GET \u002Fapi\u002Fbooks","); ",[145,868,869],{},"@GetMapping(\"\u002F\")"," keeps the trailing slash. ",[145,872,873],{},"{id:\\d+}",[145,875,876],{},"{id}",[145,878,879],{},"server.servlet.context-path"," in profile-less ",[145,882,883],{},"application.properties",[145,885,886],{},"application.yml"," (not a test resource, not ",[145,889,890],{},"application-*.properties",[145,892,893],{},"application-*.yml",") prefixes every route",[182,896,897,900],{},[200,898,899],{},"Guards",[200,901,902,153,905,153,908,153,911,812,914,916,917,380,920,380,923,380,926,929,930,933,934,937,938,941,942,945,946,949,950],{},[145,903,904],{},"@PreAuthorize",[145,906,907],{},"@PostAuthorize",[145,909,910],{},"@Secured",[145,912,913],{},"@RolesAllowed",[145,915,787],{}," rules (",[145,918,919],{},"requestMatchers",[145,921,922],{},"antMatchers",[145,924,925],{},"mvcMatchers",[145,927,928],{},"pathMatchers",", Kotlin ",[145,931,932],{},"authorize",") — first chain by ",[145,935,936],{},"@Order"," then source order whose ",[145,939,940],{},"securityMatcher"," matches; a chain with none matches every route; a ",[145,943,944],{},"RequestMatcher"," bean matches none. Java finds the chain on a ",[145,947,948],{},"@Bean"," method whose return type is ",[145,951,787],{},[182,953,954,957],{},[200,955,956],{},"Beans",[200,958,959,153,962,153,965,153,968,153,971,153,974,976,977,980,981,380,984,987,988,380,991,380,994,997],{},[145,960,961],{},"@Service",[145,963,964],{},"@Component",[145,966,967],{},"@Repository",[145,969,970],{},"@Controller",[145,972,973],{},"@RestController",[145,975,948],{},". An injected interface is ",[145,978,979],{},"BOUND_TO"," the single implementing bean, or the ",[145,982,983],{},"@Primary",[145,985,986],{},"@Qualifier"," one (constructor parameter or ",[145,989,990],{},"@Autowired",[145,992,993],{},"@Inject",[145,995,996],{},"@Resource"," field)",[182,999,1000,1003],{},[200,1001,1002],{},"Tables",[200,1004,1005,1006,1009,1010,1013,1014,380,1017,1020,1021,1024,1025,380,1028],{},"JPA ",[145,1007,1008],{},"@Entity",": ",[145,1011,1012],{},"@Table(name)"," or Spring Boot snake_case. Spring Data repository calls (",[145,1015,1016],{},"find*",[145,1018,1019],{},"save*"," \u002F …) and ",[145,1022,1023],{},"@Query"," table names are ",[145,1026,1027],{},"READS_TABLE",[145,1029,1030],{},"WRITES_TABLE",[182,1032,1033,1036],{},[200,1034,1035],{},"Entry points",[200,1037,1038,292,1041,1044,1045,380,1048,380,1051,380,1054,380,1057,292,1060,1044,1063,380,1066,292,1069,296],{},[145,1039,1040],{},"@Scheduled",[145,1042,1043],{},"scheduled","), ",[145,1046,1047],{},"@KafkaListener",[145,1049,1050],{},"@RabbitListener",[145,1052,1053],{},"@JmsListener",[145,1055,1056],{},"@SqsListener",[145,1058,1059],{},"@EventListener",[145,1061,1062],{},"listener",[145,1064,1065],{},"CommandLineRunner",[145,1067,1068],{},"ApplicationRunner.run",[145,1070,1071],{},"main",[182,1073,1074,1077],{},[200,1075,1076],{},"HTTP clients",[200,1078,1079,153,1082,153,1085,153,1088,153,1091,1094,1095,1098,1099,1102,1103,1106,1107,1109,1110,609,1113,1116],{},[145,1080,1081],{},"RestTemplate",[145,1083,1084],{},"RestClient",[145,1086,1087],{},"WebClient",[145,1089,1090],{},"@FeignClient",[145,1092,1093],{},"@HttpExchange"," → ",[145,1096,1097],{},"http:"," nodes and ",[145,1100,1101],{},"HTTP_CALLS",", the same shape other plugins emit, so ",[145,1104,1105],{},"cg link"," can match them. URI templates keep ",[145,1108,876],{},". One ",[145,1111,1112],{},"baseUrl(\"https:\u002F\u002Fhost\")",[145,1114,1115],{},"create(\"https:\u002F\u002Fhost\")"," on the same call is prefixed onto a relative template",[182,1118,1119,1122],{},[200,1120,1121],{},"Tests",[200,1123,1124,1125,1128,1129,153,1132,158,1135,1138,1139,1142],{},"JUnit 4, JUnit 5, TestNG (",[145,1126,1127],{},"entry_kind: test","). ",[145,1130,1131],{},"MockMvc.perform(get(\"\u002Fapi\u002Fbooks\u002F{id}\", 1))",[145,1133,1134],{},"WebTestClient",[145,1136,1137],{},"TestRestTemplate"," become ",[145,1140,1141],{},"TEST_HTTP"," edges to the route",[141,1144,1145],{},"Kotlin projects keep the same routes, guards, and tables as before. Exposed tables stay in the Kotlin plugin. A Kotlin Spring repo gets this preset because detection sees the Gradle or Maven file.",[171,1147,1149],{"id":1148},"limits","Limits",[698,1151,1152,1162,1165,1168,1175,1186,1199,1205],{},[405,1153,1154,1155,153,1158,1161],{},"Lombok members (",[145,1156,1157],{},"@Getter",[145,1159,1160],{},"@RequiredArgsConstructor",") are not invented.",[405,1163,1164],{},"Overload arity is not part of the id. A call binds the shared method node. When those overloads return different types, a chain stops: there is no single type for the next call.",[405,1166,1167],{},"A receiver whose type is not in the project does not fall back to a name match.",[405,1169,1170,1171,1174],{},"An inferred lambda parameter (",[145,1172,1173],{},"xs.forEach(x -> x.line())",") has no type, so that call falls through to a unique-name match and can edge every project method of that name.",[405,1176,1177,1178,1181,1182,1185],{},"A field chain ",[145,1179,1180],{},"a.b.c()"," binds ",[145,1183,1184],{},"c"," when each field's type is a project class. A call chain does the same from return types.",[405,1187,1188,1189,1191,1192,1195,1196,1198],{},"Gradle ",[145,1190,804],{}," and ",[145,1193,1194],{},"settings.gradle.kts"," are Kotlin sources. The Kotlin plugin already treats ",[145,1197,574],{}," as Kotlin, so a mixed tree counts those scripts as Kotlin, not Java.",[405,1200,1201,1202,1204],{},"Android XML layouts are not read. See ",[150,1203,54],{"href":55}," for the Kotlin side of a mixed repo and the shared scip-java run.",[405,1206,1207,1208,1211,1212,1215],{},"Spring WebFlux functional routes (",[145,1209,1210],{},"RouterFunctions.route()","), reactive repositories beyond the forms above, Micronaut, Quarkus, Jakarta servlets, and JDBC \u002F ",[145,1213,1214],{},"JdbcTemplate"," raw SQL are not extracted.",{"title":1217,"searchDepth":1218,"depth":1219,"links":1220},"",4,2,[1221,1222,1223,1224,1225,1226],{"id":173,"depth":1219,"text":174},{"id":246,"depth":1219,"text":247},{"id":514,"depth":1219,"text":515},{"id":692,"depth":1219,"text":693},{"id":777,"depth":1219,"text":778},{"id":1148,"depth":1219,"text":1149},"What .java adds beyond Install, CLI specs, and Graph schema: the heuristic syntax layer and the ids those pages do not spell out. Toolchain fit: cg doctor. Why a file stayed heuristic: cg coverage.","md",{},true,{"title":50,"description":1227},"R_wiIa6ox9GAh_Wtq5BspPpsrAEF6VMTYsZBVPX_5As",[1234,1236],{"title":46,"path":47,"stem":48,"description":1235,"children":-1},"cg is a Python package (Python 3.11+). The PyPI name is cg-code-graph; the commands are cg and cg-mcp. It installs as a user-level tool. No checkout and no sudo.",{"title":54,"path":55,"stem":56,"description":1237,"children":-1},"What .kt \u002F .kts add beyond Install, CLI specs, and Graph schema: heuristic vs scip-java, the env flags, and the ids those pages do not spell out. Toolchain fit: cg doctor -h. Why a file stayed heuristic: cg coverage.",1792170235667]