[1.6.2] - 2026-10-03
Highlights
- Far fewer wrong links, in every language. A call, import or type now resolves the way its language scopes names — through imports, packages, namespaces and the class it is written in — so it stops landing on an unrelated symbol that only shares its name. This covers TypeScript and JavaScript, Python, Java, Kotlin, Scala, C#, VB.NET, Swift, Objective-C, Go, Rust, C and C++, PHP, Ruby, Dart, Lua, R and more, and makes callers, impact and
codegraph_exploreanswers more trustworthy. - Overloads,
superand recursion resolve correctly. A call reaches the overload its arguments fit, asupercall reaches the parent's method, and a method that calls another overload, or another object's method of the same name, no longer looks like it calls itself. - Routes for more frameworks. Angular (including Nx libraries), Vue Router admin apps, Rails nested routes, Flask's
add_url_rule, ASP.NET FastEndpoints, Play subprojects, Vapor closure routes and Expo Router API routes are found. NestJS and Laravel routes are named by the path a request actually takes, and a Spring or Laravel test that calls a route by URL counts as covering it. - More of your code in the graph. Vue Options API components, Java and Kotlin enum constants with bodies, Flow-typed JavaScript, Kotlin infix calls, React Native native views and events, Expo modules, tag-based CFML and Delphi
.incfiles are all indexed now. - Windows: no flashing windows, no random crashes. The background server no longer pops up console windows while it works, sporadic access-violation crashes (exit code 3221225477) while indexing or shutting down are fixed, and
codegraph upgradeworks while an agent session is using CodeGraph. - A steadier background server. Newer MCP clients such as Antigravity connect again, Claude Code sees the full text of
codegraph_status, a session that lost the shared server reconnects by itself, and a project queried throughprojectPathis released after 10 idle minutes. - Indexing that finishes. Large C and C++ projects no longer run out of memory while resolving references, a COBOL file can no longer stall indexing, and
codegraph synckeeps every caller of a name that is defined more than once. - Upgrading: re-index your projects after this release — most of these fixes are written while indexing.
New Features
- In Nuxt and Astro projects, a file-routed page is now linked to the component its file defines. An Astro endpoint is linked to the HTTP-verb handlers it exports, like
export const GET. Before, a page route like Nuxt'spages/admin.vueor Astro'ssrc/pages/about.astrolinked to nothing, so callers, impact and flows stopped at the route. - React Router links and
navigate(…)calls written through a route-config object, like bulletproof-react'spaths.app.discussion.getHref(id), now reach the route they open. A<Link>with an arrow-function attribute before itsto, such asonMouseEnter={() => …}, is read too. - React Router data-router routes are named by their full path: nested
childrenpaths are joined to their parent's,path: paths.app.root.pathconstants are read, andlazy: () => import('./routes/x')routes link to the module's component. A guard wrapper like<ProtectedRoute>no longer stands in for the page. On bulletproof-react, every route now has its real path and page. - Vapor routes whose handler is a trailing closure, like
app.get("hello") { req in … }, WebSocket routes likeapp.webSocket("chat") { req, ws in … }, androutes.on(.POST, "x", use: handler)registrations are now found, and a closure route links to what the closure calls, the way an Express inline handler does. Before, only routes with ause:handler were read, and a closure route linked to nothing, so callers, impact and flows stopped at it. - Flow-typed JavaScript files (those with
@flowin their header comment) are now parsed like TypeScript, so type annotations likerender(): React.Nodeno longer cut classes short. This mostly affects React Native code: on React Native's own libraries the graph gained over 8,000 links, and component classes keep their methods. Files without the pragma are unchanged. Re-index after upgrading. - A link made by a framework or bridge resolver now records which one made it (
metadata.framework, such asswift-objc-bridgeorreact-native-bridge), as the README describes. Before, only synthesized event and view channels were named. - ASP.NET apps built with FastEndpoints now have their routes: each endpoint class's
Get(…)/Post(…)inConfigure()becomes a route linked to its ownHandleAsync/ExecuteAsync, including paths kept in a request class'sRouteconstant. ardalis/CleanArchitecture went from no routes to 24. Minimal API routes written without a leading slash (app.MapGet("api/todos", …)) are now named/api/todos. - Play projects kept in subdirectories are recognized, so each one's
conf/routesis read. A repository with no Play build at its root, like playframework's samples, went from no routes to over 130. - Rails routes are now read with their nesting:
namespaceandscopeadd their path and controller module, nestedresourcessit under their parent's:id, andmember/collectionblocks add their actions. A namespaced route now links to its own module's controller. Routes in a Rails engine'sconfig/routes.rbare found too: solidus went from no routes to over 600, and mastodon's route-to-action links nearly tripled. - Flask routes registered with
add_url_rule(…)are now found and linked to their view function or class-based view. So are routes registered through a project's own helper that passes a list of paths and aview_func=. flaskbb, which registers every view that way, went from no routes to over 100. - Vue components written with the Options API (
export default { methods: {…}, computed: {…}, watch: {…}, mounted() {…} }), as every Vue 2 app is, now have their methods, computed properties, watchers and lifecycle hooks in the graph. Each one has its own callers and calls, and a template's@click="handleLogin"links to the method it runs. On vue-element-admin that's over 800 new links, where a component's calls used to belong to the whole file. - React Native events whose name is held in a constant now link native code to the JavaScript that listens for them, like NetInfo's
addListener(PrivateTypes.DEVICE_CONNECTIVITY_EVENT, …)or a Java.emit(PROGRESS_EVENT, …). The constant is read the way the language scopes it, from the same file, an import or its owning class, so a parameter that happens to share a constant's name is never mistaken for it. - React Native views declared with
requireNativeComponent('X'), the older Paper style that react-native-maps and segmented-control use, now link from JavaScript to their native iOS and Android implementations, as Codegen specs already did, including in plain.jsfiles. A JSX tag written under a different name than its component, like<Autocomplete>forimport Autocomplete from './autocomplete.vue', now links to the component it renders. - Expo Router API routes (
app/hello+api.ts) are now endpoints, one per exported method, likeGET /hello, bound to the function that handles them. They used to show up as a screen named/hello+api. In a repository whose root declares Expo Router for an example app, a Next.js app in its own folder, like react-native-true-sheet'sdocs/, no longer gets Expo screens made from its files. - Calls into an Expo module now reach the module's native functions even when the JavaScript names the module something else, like expo-camera's
CameraManagerforrequireNativeModule('ExpoCamera'). Both the iOS and the Android implementations are linked. expo-camera's calls used to link back to the same-named method making the call, so a method looked like it called itself. - Angular apps split across Nx libraries, like angular-spotify, now have their routes and navigation. A lazily loaded route written
async () => (await import('@app/home')).HomeModuleis followed through the library'sindex.tsto the module it re-exports, and arouterLinkin one library now reaches a screen declared in another. Route paths built from a class constant (RouterUtil.Configuration.Lyrics,`issue/:${ProjectConst.IssueId}`) or an enum are now read. A redirect in a routes file that only lazy-loads others now counts, androuter.navigate(['project', 'issue', id])withoutrelativeTois read from the root, as Angular does. Re-index Angular projects after upgrading. - React Router apps now show navigation written as React Router v5's
<Redirect to="/login" />and through a styled link, like react-boilerplate'sHeaderLink = styled(Link)used as<HeaderLink to="/features">. Apps built this way had routes but no links between their screens. - SvelteKit routes are now named by the address a browser asks for. A
(group)folder like(app)or(marketing)is no longer part of a route's path, and a parameter with a matcher, like[id=integer], is just:id. Sogoto('/blocks')and<a href="/blocks">now reach a page that lives insrc/routes/(app)/blocks/, where before they reached nothing and the app's screens showed no navigation. Re-index SvelteKit projects after upgrading. - Vue Router apps built like vue-element-admin, vue-admin-template or vben now have their routes and screens. Routes declared in a named table (
export const constantRoutes = [...],const routes: RouteRecordRaw[] = [...]), in per-module route files, or throughnew Router(...)are now read. Child routes are joined onto their parent's path, and the parent's component is the layout around them. A lazily loaded view (() => import('@/views/dashboard/index')) is bound to the file it names, andthis.$router.push(...)counts as navigation. Nuxt's file-based routes now come only from a Nuxt app, so a plain Vue app'spages/folder no longer turns into made-up screens, and a Nuxt app at the root of its repository now gets its routes. Re-index Vue projects after upgrading. - NestJS routes are now named by the path a request takes: the global prefix from
app.setGlobalPrefix('api')is applied, along with itsexcludelist, and so is URI versioning fromapp.enableVersioning(...), with@Version,VERSION_NEUTRALand a controller's ownversiontaken into account. A route that used to appear asGET /useris nowGET /api/v1/user, so a front end'sthis.http.get('/api/v1/user')orfetchcall connects to the controller method that serves it. Re-index NestJS projects after upgrading. - Laravel routes are now named by the path a request takes: a leading
/is added where the routes file leaves it out,Route::prefix()andRoute::group(['prefix' => …])groups are applied, and routes inroutes/api.phpcarry the/apiprefix Laravel serves them under, read from yourRouteServiceProvider,bootstrap/app.phpor any file that mounts a routes file. A front-endfetch('/api/…')now connects to the Laravel route that serves it. Re-index Laravel projects after upgrading. - Controllers that Spring or Laravel tests exercise by URL now count as tested. That covers MockMvc's
perform(post("/owners/new")), WebTestClient, TestRestTemplate, RestAssured, Laravel's$this->postJson('api/me'), Pest'sget('/about'), and a project's own request helpers built on them.codegraph_explorenow names the test suite that reaches such an endpoint, where before every one of them looked untested. Re-index Spring and Laravel projects after upgrading. - In an Angular app, a method a template calls, like
(click)="toggleFavorite()"or(ngSubmit)="submitForm()", is now linked from its component. These methods used to show no callers at all, so impact and callers questions stopped at them, and dead-code checks could list them as unused. Re-index Angular projects after upgrading. - Angular apps now have routes and navigation in the graph. Each screen in a
Routesarray is a route named by its full path, including children, lazily loadedloadChildrenfiles and NgModules, paths written as route constants or$localizestrings, and redirects. Each route is linked to its component.router.navigate([...]),navigateByUrl, a guard'screateUrlTreeand everyrouterLinkin a component's template link to the screen they open, and a template's child components (<app-article-list>) are linked to the component that renders them. Questions like "where does this button go" and "what renders this component" now have answers incodegraph_explore. Re-index Angular projects after upgrading. - Delphi and Free Pascal include files (
.inc) are now indexed as Pascal. Before, they were read as PHP and came up empty. A.incfile with a<?phptag is still PHP, and acodegraph.jsonmapping for.incstill wins. Thanks @ijbranch for the report. (#2279) - In tag-based CFML, calls written in tags are now linked: in
<cfset>,<cfif>/<cfelseif>,<cfreturn>,<cfloop condition>and#…#expressions. Before, only<cfscript>and<cfquery>code was read, so callers and impact found almost nothing in tag-based components. Functions wrapped in tags like<cfprocessingdirective>or<cfsilent>are now indexed too, and a<cfinterface>is indexed as an interface thatimplementslinks to. Re-index CFML projects after upgrading. Thanks @HarryMuc for the report. (#2091) - Java enum constants and Kotlin enum entries with a body of their own now have their methods in the graph. Examples are
PLUS { int apply(…) { … } }andNewBuffer { override fun pipe() … }. Before, those methods were missing and every call inside them was dropped. jsoup's HTML tokenizer and tree builder are written this way, so over 2,000 of their calls were invisible. Re-index to pick this up. - Kotlin infix calls, like
Users.id eq id1or koin'ssingle { … } bind MyApi::class, are now recorded as calls to the infix function. Before, they had no callers at all. On Exposed,eqnow shows over a thousand callers. Bit operations on numbers (x and 0xff,h shr 8) are left to Kotlin's own operators, even where the project defines a same-named extension. Re-index after upgrading.
Fixes
Windows
- On Windows, terminal windows no longer flash open and closed while CodeGraph runs in the background. Since 1.6.1, a background MCP server popped up a console window (a full Windows Terminal window when that is the default terminal) several times when it started and again every time it re-synced a changed file. All of CodeGraph's git calls now run hidden. Thanks @Suharaz, @23q3, @A-Van-Gestel, @HarryMuc and @MzaGuille. (#2094, #2096, #2312)
- On Windows, a project opened with a different drive-letter or folder-name case, like
d:\work\appandD:\Work\App, now joins the CodeGraph background server that is already running for it. Before, each spelling started a server of its own that exited at once, so the session quietly served the graph by itself with no shared file watching or auto-sync, andcodegraph listshowed the project twice. Thanks @greatjackzhou. (#2278) - On Windows,
codegraph upgradeno longer breaks the install while an agent session is using CodeGraph. It used to stop partway and leave CodeGraph unable to start; it now swaps the new files in with CodeGraph running and puts the previous version back if anything fails, and re-running the PowerShell installer works the same way. If an earlier upgrade already broke your install, re-runirm https://raw.githubusercontent.com/colbymchenry/codegraph/main/install.ps1 | iexto repair it. Thanks @tippmar-nr for the report. (#2185) - On Windows, CodeGraph no longer sometimes crashes with exit code 3221225477 (an access violation) on a busy machine: right after parsing in
codegraph init,codegraph indexand background syncs, or as the background server shuts down. Stopping one of its helper threads (the ones that parse files, resolve references, write the index and count changes forcodegraph_status) while it was still starting up, or before it had finished cleaning up its memory, took the whole process down. Threads now finish starting and clean up before they exit.
The background server, sessions and the CLI
- The Claude Code prompt hook no longer runs on the messages Claude Code uses to hand a subagent's report back to the main session. Before, such a long report could keep the hook busy past Claude Code's 30-second hook timeout and inject context unrelated to what you asked. Thanks @danusha2345, and @tippmar-nr for the report. (#2184)
- Newer MCP clients such as Antigravity 2.5 connect again: the server now answers their
server/discoverprobe right away with "method not found", so they go straight on to the regular handshake instead of waiting on a reply that could take seconds or never come. Thanks @danusha2345, and @samem26 for the report. (#2084) - A CodeGraph session that queried another project through
projectPathno longer keeps that project locked for as long as it runs: after 10 minutes without a query it lets the project go, so the project's own session andcodegraph indexcan take over again (tune withCODEGRAPH_PROJECT_IDLE_TIMEOUT_MS,0keeps it open). Thanks @danusha2345, and @bompus for the report. (#2087) - Claude Code now shows the model the full text of
codegraph_statusand of explore's stale-index refusal. Both results also carriedstructuredContent, and Claude Code shows a result'sstructuredContentin place of its text, so the model saw only a freshness JSON object: no refusal message, no retry guidance and no status report. Both results are now text only. Thanks @bompus. (#2088) - When an agent asks CodeGraph about a separate git repository nested inside an indexed project, one the project's index leaves out (for example because the parent's
.gitignoreexcludes it), it now gets the usual "isn't indexed" guidance instead of answers from the parent project's code. Nested repositories the parent does index, such as submodules, work as before. Thanks @wstczyw for the report. (#2110) - An agent session that lost its connection to CodeGraph's shared background server, or couldn't reach it at startup, no longer stops that server from running for the rest of the session. It reconnects on its own once the server can start, so other sessions on the same project get auto-sync back instead of running read-only. Thanks @ijbranch for the report. (#2277)
codegraph indexno longer gives up with "Could not verify that the active CodeGraph daemon has stopped" while the background server is still finishing its shutdown, andcodegraph daemonno longer reports such a server as one it could not stop; both now wait for it to exit, for up to about 20 seconds. An agent session that is serving CodeGraph by itself, because the background server was unavailable, now also waits for that work to stop before it exits instead of exiting partway through, which could crash on Windows. Thanks @bompus. (#2311)- Anonymous usage telemetry now sends one daily count per tool or command, as documented, instead of one per codegraph process. Before, every MCP server launch, CLI command and prompt hook queued its own entry, so a busy machine uploaded thousands of copies of the same count each day. If you have telemetry turned off, nothing changes.
Indexing and sync
- A COBOL file whose last line ends inside the sequence area (columns 1-6), such as a closing period indented only four spaces, no longer stalls indexing for over a minute and then ends up in the index with no symbols.
- Editing a file that defines the same name more than once, like two classes that each have an
executemethod or a method's overloads, no longer moves every caller from other files onto one of them duringcodegraph sync. A sync interrupted partway through a file also no longer loses those callers until a full re-index. Thanks @ijbranch for the report. (#2276) - Indexing a large C or C++ project no longer runs out of memory partway through "Resolving refs". Headers whose include guard is written as
#define X_H 1, as in OpenSceneGraph and osgEarth, or that are included under a build flag codegraph cannot know, used to be re-read on every include path, which grows exponentially with the depth of the include tree. Each is now read once per include state, and a hard limit stops the check on any include tree that is still too large. Thanks @danusha2345, and @coolhitmanleon for the report. (#2127) - On a busy machine, indexing or syncing a small project no longer starts extra background threads for resolving references that it can't use. Under heavy load the slower pace made a ten-file project look big enough to need them, which added seconds to the run and held extra memory.
Across languages
- A type that extends another type of the same name now links to that other type instead of to itself. When the source spells out the qualifier, that qualifier picks between same-named candidates. Before, cats'
trait BigDecimalInstances extends cats.kernel.instances.BigDecimalInstancesand everytrait AllOps … with Functor.AllOps[…]pointed back at the declaring trait, and Newtonsoft.Json'sJsonConverter<T> : JsonConverterextended itself. - Framework name conventions for Django, FastAPI, Flask, ASP.NET, Gin, SwiftUI and Vapor now only pick a class the reference can see. Examples of these conventions are "a
…Viewis a view", "a…Serviceis a service" and "a capitalized name is a model". The pick starts from the reference's own file and then its package, and never takes a class declared inside some function or nested in another file's class. Before, Django REST framework's tests linked each file's ownMockViewandSerializerto another file's, and netbox's tests linkedTestForm()to a form declared inside a different test function. - A method that calls a same-named method on another expression's result is no longer linked to itself in any language. Examples are Scala's
requestToArmeria(request).execute()insideexecute(), Rust'sself.0.into_route(state)insideinto_route(), and Kotlin'sthis@Buffer.write(…)from an inner object. A value whose initializer chain calls a same-named method, like sttp'sval response = basicRequest.get(…).response(…), no longer links to itself either. - A method that hands its call on to another object is no longer linked to itself. In TypeScript and JavaScript, a call through
this.<field>orwindow.<x>counts as recursion only when the field is declared as the method's own class. A guess from a receiver's name alone never lands on the calling method. Before, BookStack'stoggle()doingthis.container.classList.toggle('open'),listen()doingwindow.$events.listen(…), andFileStorage::deletedoing$storage->delete($path)each pointed at themselves. - A function or name passed as a value now resolves to what is in scope where it's written. A function nested inside another function is only reachable from inside it. In Python, a parameter or local of the same name is that local. A pytest fixture is a test's parameter only in its own module or under its
conftest.py. Before, httpx'sself._build_auth(auth)linked to anautha test defines inside another function, andauth_flow(self, request)handingrequeston linked to the package'srequest()function. - In Java, C#, Kotlin, Swift, Scala, Dart and VB.NET, a call now reaches the overload whose parameters fit its arguments, not whichever same-named overload was indexed first. For example,
HashCodeBuilder.reflectionHashCode(this)now reaches the one-argument overload with varargs, not a three-parameter one. Each overload's callers are now its own. - A method that calls another overload of itself now links to that overload rather than to itself. An example is
toInstant(instant)returningtoInstant(instant, Instant.EPOCH). The fuller overload now lists its convenience overloads among its callers, so its impact includes them. This applies to Java, C#, Kotlin, Swift, C++, Scala, Dart and VB.NET. Real recursion is unchanged. - Production code no longer links to a same-named symbol inside a test suite, since tests aren't built into the program. Before, typeorm's
Record<string, …>types reached a test entity calledRecord, and okhttp's sample@Overrideannotations reached a test's nestedOverrideclass. Test-support code a project ships, such as atesting/folder or a*-testmodule, stays in reach. - A method call on a variable is no longer guessed to be a test double's method just because the double has the only method of that name. That covered classes named
Mocked…,Fake…,Stub…orDummy…: django-allauth'sresp.json()calls had all gone to itsMockedResponse. A test that names the double still calls it. - A call through a class name, like
THorse.Get(…),MyView.as_view()orColorChoices.values(), now reaches the class method that class inherits. The inheritance is read from the class declarations themselves, in Pascal, Python, Ruby, PHP, TypeScript/JavaScript and the Java family. Before, such a call was resolved by guessing from the name. On Horse,THorse.Get('/ping', …)used to land on a route-group interface'sGet120 times. Re-index after upgrading. - A method guessed from a receiver's name no longer lands on a request handler the web framework dispatches to, such as a Django or DRF view's
post/getor a controller'supdate/destroy. It also no longer lands on a test double the calling file never mentions. On django-allauth, tests'client.post(…)used to land on aClientRegistrationView425 times. On mealie,response.json()used to land on a test's_FakeHTTPResponse424 times. In Python,site = Site.objects.create(…)now makessiteaSite, sosite.save()reaches the model's ownsave. Re-index after upgrading. - In C#, Java and Kotlin, a call through a field, property or parameter now lands on the method of the type it is declared with. That includes a type inherited from a base class with its type argument filled in, a generic or
for-each declaration, a C#usingalias, and a type parameter's bound. A call no longer falls back to a guess at some project class's same-named method, and a type from outside the project gives no link. On Newtonsoft.Json,_innerWriter.WriteValue(…)inside a writer wrapper used to land on the wrapper's ownWriteValue, and aTextWriter'sWrite(…)on a test writer's. On commons-lang, aDateFormatfield'sparse(…)used to land on the project'sDateParser284 times. - A call on a variable declared with a type from outside the project (
List<String> list,var sb = new StringBuilder(),signer = TimestampSigner()) no longer lands on a project type's method with the same name. On gson,list.add(…)used to land on a project list wrapper; on commons-lang,s.length()andbuffer.append(…)on project classes. In Python, a keyword argument inside a call (prefix=IPNetwork(…)) is no longer taken for an assignment to that name. - A call on a type from outside the project, like
Integer.valueOf(…),Arrays.asList(…),Object.assign(…)or Delphi'sException.Create(…), no longer lands on the project's own method with that name. On commons-lang,Integer.valueOfused to land onStringUtils.valueOfover 800 times. Go's exported variables and Pascal's capitalized parameters and locals are not mistaken for type names. - In PHP, CFML, Pascal, COBOL and VB.NET, a call written in a different case than its definition now resolves, like
formatprice()forFormatPriceor CFML'sToMatchWithCase()fortoMatchWithCase. These languages ignore case in names, but such calls used to be dropped before resolution. - In Java, Kotlin, Swift, C#, C and C++, Go, Scala, Ruby, Dart and the other case-sensitive languages, a name no longer links to a symbol whose name differs only in case. On jsoup, JUnit's
@Testhad linked every test to atestmethod;new CookieManager()had linked to acookieManager()getter, and aMethodtype to amethod(). PHP, Pascal, CFML, COBOL and VB.NET, whose names really do ignore case, are unchanged. - A
supercall in an overriding method, likesuper.viewDidLoad(),[super init],base.Handle(),parent::setUp()orsuper().dispatch(…), no longer makes the method look like it calls itself. The call goes to the parent's version, so an override stops showing up as recursive and no longer lists itself among its own callers. - A generic type parameter, like
Aindef zipWith[A, B](…),Tin<T> T max(…)orclass Foo<T>, no longer links to a project symbol that happens to share its name. On cats, oneimplicit def Ahad thousands of made-up dependents from everyAin the library. The same goes for Rust, Dart, TypeScript, Java, Kotlin, Swift, Go, C# and C++. A class or other type declared inside a function is only linked from inside that function. In Scala, adef's own parameter, likefin(f: A => B), no longer links to a same-named field elsewhere. A bare name no longer reaches a type nested inside another type unless the code is inside that type, extends it or imports its members; the type in scope is linked instead, like cats' ownFlatMapin place ofEval's nestedFlatMap. Re-index projects in these languages after upgrading.
JavaScript and TypeScript, with Vue, Svelte, Astro, React, Express, NestJS and Hono
- In Vue, Svelte and Astro files, a component now owns its script, and what a
<script setup>, a Svelte instance script or Astro frontmatter does at its top level is the component's doing. That covers a Nuxt page'suseAsyncData(…), a Svelte page'sonMount(…)and Astro'sawait getCollection(…). Imports and a module-level script stay with the file. Before, those calls belonged to the file, so callers and flows from a component found nothing. The component was also recorded as containing its own file, and a file with no script had no file node at all. - In JavaScript and TypeScript, a CommonJS
require('./application')now counts as an import of that file, the way an ESMimportdoes. A module path also resolves the way Node and bundlers find it: extensions,indexfiles and path aliases. Before, a CommonJS file depended on nothing at file level, so Express's ownlib/express.jsshowed no imports and impact analysis missed the files it loads. An extensionless side-effect import likeimport './polyfills'also stopped at its own import statement instead of reaching the file. - An Express route whose handler is written inline as
function (req, res) {…}, the form Express's own examples use, now links to what that handler calls, just like an arrow handler does. The handler is the route's last argument, so an inline middleware before a named handler no longer stands in for it, and a wrapper likeasyncHandler(async function (req, res) {…})and a trailing comma both work. Before, a route such asPOST /loginlinked to nothing. - In NestJS projects, the provider naming convention (
…Service,…Controller, …) now picks a class only from the reference's own file. Another file's provider is reached through its import, or by ordinary name matching that prefers the nearest declaration. Before, the convention's preference for*.service.tsfiles sent Nest's own specs'TransientServiceandTestServiceto same-named classes in unrelated sample apps. - In Astro projects, the component-name convention now applies only inside
.astrofiles, where components are used. Before, a TypeScript type with a component's name was linked to that component: astrowind'simage?: ImageandcallToAction?: CallToActionin its type declarations, and starlight's Playwrightpage: Pagein its tests. - In JavaScript and TypeScript, the Express conventions for middleware (
validate…,auth,logger, …), controllers and services now pick only the calling file's own declaration. Another file's is reached only through animportorrequire. Before, SvelteKit's remote functions linkedvalidate(arg)to its config loader'svalidatein another package, and Express's examples linkedlogger('dev')to one example'slogger. - In JavaScript and TypeScript, the React conventions for hooks (
use…) and contexts (…Context,…Provider) now pick only from the reference's own file. Another file's hook or context is reached only through an import. An optional call likeonSuccess?.(…)now gets the same scope rules as a plain call. Before, trpc's WebSocket adapter'screateContext?.(…)option linked to an example app'screateContext, zod'sschemas.ParseContextlinked to the v3 copy instead of v4's, and bulletproof-react's apps linkeduseUser()to one another's. - What a Svelte component's instance
<script>or a Vue component's<script setup>declares is now private to that component. Only a Svelte<script module>, a plain Vue<script>, or a type a<script setup>exports can be reached from another file. Before, shadcn-svelte's<Item.Root>linked to atype Itemthat one example component declares for itself, and halo'sisActiveimported from its editor core linked to a tab component's local value. - In JavaScript and TypeScript, a name the calling function binds itself, as a parameter or a plain
var/let/constabove the reference, now means that local instead of a same-named function elsewhere in the file. Before, every lodash helper'sobjectparameter linked to afunction object() {}declared insiderunInContext, and zod'snew Class(…)linked to an unrelatedClasswhenClasswas the function's parameter. Destructured hook results likeconst { t } = useI18n()still link to the function they come from. - In a project with a React front end, the React rules for hooks (
use…) and contexts (…Context,…Provider) no longer apply to backend code. In halo, a Spring app with a React UI, Java imports such asSecurityContextandObjectProviderhad been handled as React contexts. - In a project with a Vue front end, the backend's calls no longer land on Vue components. mealie's Python
QueryFilterBuilder(…)had been linking to theQueryFilterBuilder.vuecomponent. The Vue rules (compiler macros, Nuxt auto-imports, components by name) now apply only to the app's scripts. - Calls in your own JavaScript no longer link to a same-named function inside a vendored minified script, like a
*.min.jsor a bundle made of a few enormous lines. Those names are mangled. In healthchecks, every jQuery$(…)call had gone to a one-letter helper insidebootstrap-native.min.js. - Calls inside an inline route handler now keep their receivers, so they resolve like any other method call. Before, Hono's
app.get('/', (c) => c.text('Hello'))linked the route to the one othertextmethod in the project, its client'sClientResponse.text; that happened in over 400 routes. A call likeuserService.lookup(id)reaches the service it names. - A barrel's
export * as core from './core'now exports onlycore, not everything in./core. In zod,z.string()andz.number()had been landing on same-named regex constants deep in its core module instead of the schema functions. Calls throughimport * as nsalso find members a barrel forwards by name (export { safeParse } from '../core'). They follow a namespace path likez.coerce.number()too. - JavaScript calls through CommonJS
requirebindings now reach the right function.var express = require('../')followsmodule.exportsthrough anindex.jsto the function it exports, and every binding in avar a = require('x'), b = require('y')list is read.require('./utils').setCharsetmeans that module'ssetCharsetrather than its first export, and a call to a package from outside the project (supertest,node:assert) is no longer an edge to the local variable. On express, over 700express()calls now reachcreateApplication. - Imports through a tsconfig or jsconfig path alias now use the config nearest the importing file, so each app in a monorepo resolves its own
@/…or~/…alias. On bulletproof-react and trpc's examples, those imports used to fail or land in a different app. - In JavaScript, TypeScript and Vue, a call through a name destructured from a composable or custom hook, like
const { getDefaultActivityRoute } = useDefaultActivity()orconst { t } = useI18n(), now reaches the function the hook returns. These calls used to resolve to nothing. mealie, elk, halo and excalidraw each gained dozens to over a hundred such links. - In JavaScript and TypeScript, a module's top-level function, variable or type that the module doesn't export is no longer linked from other files. Every form of export still counts: the
exportkeyword,export { … }lists,export default, and a default-exported object. On typeorm, test fixtures' localColumnMetadataused to captureimport { ColumnMetadata } from "typeorm"; on sveltekit, an unexportedresolvecollected other files'resolve(…)calls; on zod, a localzcollected thezodpackage imports. - A JavaScript or TypeScript call on something the file imports, like
fireEvent.click(…)orutil.omit(…), no longer links to a same-named method declared in the calling file itself. - TypeScript's
import type { X }no longer reads as an import of something namedtype, andimport { a, type B }bindsB, nottype B. So a type-only import now links to the module it names, where it used to link to whatever project symbol had that name. A type imported from a package, likeRsbuildConfigfrom@rsbuild/core, no longer links to a project symbol, and JavaScript and TypeScript names no longer match a symbol whose name differs only in case (Mockis notmock). - In a monorepo with an Expo app next to a Next.js app, like create-t3-turbo or tamagui's starter, each router now reads only its own app. Expo Router used to read the Next.js app's files too, so
layout.tsx,page.tsx, a_componentsfolder and an API route showed up as screens named/layout,/pageor/_components/posts, and a shared package's files became screens as well. Re-index such monorepos after upgrading. - Calls in Vue, Svelte and Astro components now follow the same rules as JavaScript and TypeScript. A
t('…')fromuseI18n()or aref(…)fromvueused to link to an interface property or a local variable of the same name elsewhere in the project, so on halo two unrelated symbols had over a thousand made-up callers each. A call imported from a package is also no longer mistaken for a project symbol when the package is declared in a nested app'spackage.jsonor a Deno import map. An import through an alias CodeGraph can't follow, like SvelteKit's$lib/…or a nested Nuxt app's~/…, is still treated as project code. Re-index Vue, Svelte, Astro and JavaScript/TypeScript projects after upgrading. - A minified or bundled JavaScript file is now recognized as generated even when it isn't named
.min.js, for example a docs site'sbundle.js, a readable webpack build or a vendoredunderscore-min.js. Its one-letter functions now rank below your own code in search andcodegraph_exploreanswers. - JavaScript and TypeScript calls are no longer linked to a class member that merely shares their name. A call on a namespace import, like zod's
z.string()(import * as z from 'zod'), or on something imported from an npm package, used to link to whichever class in the project had astringmember, and a bare call like mocha'sit(…)ordescribe(…)to an interface'sitproperty or a class'sdescribefield. On zod one test helper's getter had thousands of made-up callers and topped the most-depended-on list. A React hook or component imported from a package, likeuseQueryfrom@tanstack/react-query, no longer links to a same-named one in the project, and a hook nested inside another function is no longer a target at all. Re-index JavaScript and TypeScript projects after upgrading.
Python
- A Python module member used through the imported module, like
generic.ObjectEditViewafterfrom netbox.views import generic,serializers.ValidationErrororutils.assert_deserialize(…), now also follows the package's re-exports to its definition. Before, netbox's view classes lost theirgeneric.*base classes, and mealie's test helpers called throughutils.went unresolved. - A Python name imported from a package now follows the package's re-exports to where it's defined. That covers both
from .users import *andfrom .tokens import Tokenin its__init__.py. Before, httpx's own tests'httpx.Client(…)andhttpx.URL(…), pytest'spytest.raises(…)andpytest.param(…), and netbox'sfrom users.models import Userwent unresolved or to a same-named class elsewhere, such as a test'sUseror an Alembic migration's copy of a model. - In pytest tests, a parameter now takes the class its fixture returns, so a call on it reaches that class's method. If the class comes from a library, the call no longer reaches the project's only method of that name. Fixtures a
conftest.pypulls in withfrom … import *orpytest_pluginsnow count as in reach. Before, flask'srunner.invoke(…)on click'sCliRunner()linked to the project'sFlaskCliRunner.invoke, and@app.get(…)on aFlask(…)fixture linked to an unrelatedget. - In Python, an attribute passed as a value through an object nothing types, like netbox's
device=self.parent.device, is no longer linked to the project's only method of that name when the object isn't named after the method's class. Before, netbox's model-field reads went to a GraphQL filter'sdevicemethod, and healthchecks'check.last_pingwent to a notification transport's. - A Python call to a name the function or module binds itself now means that local value, not a same-named function in another file. In Django REST Framework's tests,
view = SomeView.as_view()followed byview(request)had pointed at one test file'sdef view. The same goes for a parameter or afor/with … astarget. A pytest fixture a test takes as a parameter is still the fixture. - Python calls like
User.objects.get(…),self.client.login(…)orrequest.POST.get(…)no longer link to whichever class in the project has a method of that name. Such a call now links only to a member of what its receiver names, likehelpers.slugify()toslugifyinhelpers.py, and a bareget(1)never links to a method. A name the file imports from a package outside the project, likefrom django.shortcuts import render, no longer links to a same-named project function. In Django projects these made-up links had given single test or serializer methods thousands of callers, for example netbox's.all()calls on oneUserConfig.all. Re-index Python projects after upgrading. - In Python, a call written on the instance, like
self.get_breadcrumbs(...), now links to the class's own method even when the file also imports a function of the same name. Before, the import claimed it: Django REST Framework's renderers, netbox's change logging and django-allauth's account adapter all linked their own method calls to an imported helper. - In Python, a method passed as a value through a module-level variable that a setup function assigns, like
settings.docStoreConn.delete_payload_fieldsafterglobal docStoreConn; docStoreConn = QdrantConnection(), now links to that class's method. When several backend classes can be assigned, it links to the declaration they all inherit. Thanks @JosefAschauer. (#2074) - In Python, an import split over several lines in parentheses,
from x import (A, B)written one name per line, is now read in full. Before, its names were invisible to resolution, so Django REST Framework'sserializers.CharField()and netbox's model mixins linked to the wrong class or to nothing. Thanks @JosefAschauer.
Java, Kotlin and Scala
- In Java, a bare type name now resolves only to a type in reach. That is a type in the same package, one imported by name or with
.*, or a nested type used from inside its owner, from a subclass (anonymous classes included), or written through its owner as inOuter.Inner. A constructor no longer stands in for its class, and an enum constant is reached by bare name only inside its enum, in acaselabel, or through a static import. Before, retrofit'snew Retrofit.Builder()linked toRequestFactory.Builder, halo's micrometerCounterto its ownCounterclass, and jsoup'sjava.lang.Class<?>to a nested selector class. - Bare calls in Gradle Kotlin scripts (
build.gradle.kts), likeplugins { },dependencies { }orapi(…), are no longer linked to a method or property of one of the project's own classes. Build logic's extension functions on Gradle's types still resolve. Before, nowinandroid's build scripts pointed everyplugins { }anddependencies { }block at its build logic'sGraphclass, and everyapi(…)at a lint registry'sapiproperty. - In Scala, a package object's member now resolves only where it is in scope: in its own package, the packages under it, or a file that imports through that package. Before, cats' laws resolved
Eq,OrderandMonoidto thealgebrapackage object's aliases rather than thecatspackage object's, and sttp's akka tests reached a zio package object'swhenRequestMatches. - In Spring projects, a class name now resolves to the one in the reference's own file or package before any guess by folder convention. A class nested inside another file's class is never reached by its bare name. Before, every MyBatis
Exampleclass'snew Criteria()in mall linked to the firstExample's nestedCriteria, and halo's Lombok@Builderlinked to a nestedBuilderclass elsewhere. - In Scala, a kind-projector placeholder in a type, like
Align[Either[A, *]], is no longer linked to an operator method named*. A symbolic name in a type, like cats'F ~> G, now resolves only to a type. - Kotlin calls inside a DSL lambda now reach the lambda's own receiver. That receiver comes from the function the lambda is passed to, even through a typealias like koin's
Definition<T> = Scope.(…) -> T. It also wins over other types the project uses as lambda receivers elsewhere. On koin, over 2,000get()calls insingle { … }now reachScope.getinstead ofKoin.get; on Exposed,varchar(…)inside a table object reachesTable.varchar; on kotlinx.coroutines,launch { }reachesCoroutineScope.launch. - A Scala chained call like
xs.map { … }no longer lands on an object that happens to be namedmap, as with cats'alleycats.std.mapand itssyntax/instancesobjects. A type or object in a chain is only matched when the receiver names what holds it, as insttp.client4.Response(…). - Kotlin imports now decide what a name means, as Java imports already do.
import java.net.Proxyorimport org.mockito.Mockito.mockno longer links to a same-named project symbol, and a member the file declares itself still comes first. Animport x.Foopicks the right one of several same-named classes: on okhttp,MockResponse.Builder()andRequest.Builder()now reach their classes. A renaming import likeimport …internal.unsafeFlow as flowmeans the function it names. - In Java, a class you import from outside your project now owns its name. After
import java.lang.reflect.Field;the file'sFieldno longer links to a project class that happens to share the name. In gson that was a test's nestedFieldclass; in jsoup's W3C converter it was jsoup's ownDocumentandElement. A static import likeimport static org.mockito.Mockito.verify;is covered the same way. - Scala calls no longer land on another test's local value. A
val fwritten inside onetest("…") { }block was being picked for a lambda parameterfin another suite, and even forf(…)in cats' core library. A package import likeimport cats.syntax.all._no longer puts every class's members in scope. Members that really are in scope now resolve: those of an imported package object's parent types (import sttp.client4._givesSttpApi'smultipart), and of the file's own package object. - Kotlin files using newer syntax now keep their classes intact. That covers
whenguard conditions (is X if cond ->),..<ranges, multi-dollar strings ($$"…") and nullable receivers in function types (T?.() -> R). Before, the class around such code could come out as a scatter of loose functions. On Exposed, files with a parse error dropped from 65 to 43, and on kotlinx.coroutines from 50 to 46. Re-index after upgrading. - Kotlin code using an infix function whose name starts with
e, like Exposed'sUsers.id eq id1, now parses cleanly. Before, the rest of such a line was a parse error, and in a file with many of them the whole class around it could be lost. On Exposed, files with a parse error dropped from 229 to 71. Re-index after upgrading. - In Kotlin, a call with no receiver now reaches a method of another class only when that class is in reach. That means a class, an anonymous
object : Base()or an extension function's receiver around the call, what those inherit, or the receiver of a DSL lambda (koin'ssingle { get() }runs on aScope, Exposed'swithTables { … }on a transaction). An object member the file imports is in reach too. Kotlin's ownerror(…),require(x >= 0) { … }andcheck(…)no longer land on a project class's method of that name. On koin,module { … }in one test used to land on another test class's privatemoduleover 260 times, and inside a lambdaget()landed on the wrong class'sget. Re-index after upgrading. - Kotlin classes whose primary constructor sits on the line after the class name, before a supertype list (
expect open class ByteString/internal constructor(…) : Comparable<ByteString>, common in Kotlin Multiplatform code), no longer lose their members to loose functions. A call later in a chain to a Kotlin standard-library function (apply,let,toString,map,contains…) no longer lands on a project type's same-named method. On okhttp,.apply { … }used to land onConnectionSpec.apply. Re-index after upgrading. - In Scala, a call reached by its name alone now stays in reach. A name that the enclosing function binds as a parameter or local (
f(true)forf: A => B) is that local. A call later in a chain, likefa.iterator.map(…), reaches only a member of what its receiver is named after. A plain call reaches only the enclosing class and its supertypes (an anonymous subclass's base included), a companion, or an imported object. On cats, parameter calls likef(a)used to land on a case class's fieldfover 400 times, and chained.map(…)on one ops class'smap. - In Kotlin, a call to a top-level or extension function now resolves only to one the file can see: one in its own package, one it imports by name, or one from a package it imports with
*. On Exposed, tests that imported kotlin.test's or JUnit'sassertEquals, or the JDBC suite's helper, used to land on the R2DBC suite's helper over 3,000 times. On okhttp, tests that importmockwebserver3.MockResponseused to construct the deprecated class of the same name. A function type with a qualified receiver, like(DatabaseConfig.Builder.() -> Unit)?, no longer breaks the parse of the class around it. Re-index after upgrading. - A bare Java call like
verify(mock),assertThat(x)orhashCode()now links only to a method of the class it's in, of that class's parents, or one the file imports statically. It used to link to any class's method of that name: in halo, Mockito'sverifyandeqgave one service'sverifyover a thousand made-up callers, and in retrofit Truth'sassertThatdid the same to a test helper. Calls to inherited methods and static imports from the project now link to the right one, like jsoup'sattr(…)throughLeafNodeor halo'sand(…)/equal(…)throughimport static …Queries.*. Re-index Java projects after upgrading.
C# and VB.NET
- C# names now follow the language's scopes. A block
namespace X { … }qualifies only the types inside it, so a type declared after the block, or in a file's second namespace, is no longer filed under the first. A namespace written inside another isOuter.Inner. Ausinglinks to the project's namespace instead of another file'susingof the same name. Aglobal usingapplies only within its own project. A nested type is reachable by bare name only from inside its owner or a type deriving from it, including through another partial part. Before, serilog'sGuardwas filed underJetBrains.Annotations, its tests'Some.InformationEvent()went to the performance tests'Some, and AutoMapper's same-filenew Source()could reach another test class's nestedSource. - C# type names now follow namespaces. A type is in reach from its own namespace or one nested inside it, or through a
usingof its namespace. Also counted: a project-wideglobal using, the project's<Using>entries, the SDK's implicit usings, or an alias that names it. Before, Newtonsoft'sasync Tasktests linkedTaskto a test class of that name in another namespace, and AutoMapper's DTOs linked to another namespace'sBaseEntity. - C# members of an interface are now public and types declared without a modifier are now internal, as the language defines. A call on an interface-typed field now reaches the interface's method, where it used to find nothing. A guess from a receiver's name now weighs only the owner type's own name, not its namespace. Standard .NET names like
ToString,AddandWriteneed a receiver named after the owner. In every language, a guess from production code no longer lands on a mock or helper defined in a test suite. Re-index after upgrading. - In C#, a bare name like
TestContext,EasingorHelper()now resolves only to a member of the class it's written in, its outer classes, their base classes, or a type brought in withusing static. That includes aglobal using staticand a project file's<Using … Static="true"/>. On eShop, test classes'TestContextused to land on one other test class's property; on Newtonsoft.Json,TypeNameHandling.Allnow reaches the enum rather than a same-named property. - In VB.NET, a call through a receiver like
Me.Panel.Controls.Add(…)orNew System.Drawing.Size(…)no longer lands on an unrelated class's member with the same name. It now resolves only throughMe,MyBaseorMyClass, through the member's own class or module (Logger.Log(…)), or through a service lookup's type (GetService(Of Notifier).Notify()). On SCrawler, the Windows Forms designer code used to link over 700Sizecalls to a nested enum's case and over 500Controls.Addcalls to a collection class. - In C# and VB.NET, a type written in code, like
Type sourceType,List<int>,new TypeMap()orDictionary<string, Type>, now links to the type and no longer to a property, method or field that shares its name.List<…>used to link to some test class'sListproperty,Typeto an attribute'sTypeproperty, and a parameter of typeTypeMapto aTypeMapproperty instead of theTypeMapclass. Those members showed up with hundreds of made-up dependents. Reading a property or passing a method, likeBuilder.ServicesorMapGet("/x", GetItems), still links as before. Re-index C# and VB.NET projects after upgrading.
Swift and Objective-C
- An Objective-C class that conforms to a protocol of its own name now links to that protocol instead of to itself. Swift's naming conventions for views, models and controllers also no longer apply to Objective-C code. Before, every one of SDWebImage's
@interface SDDiskCache : NSObject <SDDiskCache>-style classes implemented itself. - In Swift, a call to an overloaded method now reaches the overload whose argument labels it spells, with defaulted parameters optional. Before, only the argument count was compared. Alamofire's
self.tableView(tableView, numberOfRowsInSection:)inside anothertableViewoverload linked to itself, andcancel(optionallyProducingResumeData:)linked tocancel(producingResumeData:). - A Swift call on a property declared with a type, like Kingfisher's
var cache: ImageCache!orself.storage.write(…), now reaches that type's method or one it inherits. It no longer lands on a subclass override in a test, or on another type's method of the same name. - A Swift call on a value built on the spot, like
JSONDecoder().decode(…)orRealm().create(…), now resolves to that type's method, or to one it inherits. It no longer lands on some other type's method of the same name: Vapor'sJSONDecoder().decodecalls had gone to a request's private container. - In Objective-C,
[super init]and other messages tosupernow reach the superclass's method, never the sending class's own override. This also works where the index lost the@implementation's range. On SDWebImage,NSObjectsubclasses'[super init]used to land onSDDiskCache'sinit, and[self class]in tests on a proxy class'sclass. On AFNetworking, a serializer's[super encodeWithCoder:]now reaches its superclass. Re-index after upgrading. - In Swift, a call written with no receiver, or through
self.orsuper., now reaches only a member of the type around it or of what that type inherits or conforms to, and the nearest override wins. A standard-library name later in a chain (axis.entries.removeAll(),names.contains(x)) no longer lands on a project type's method, unless the receiver or the call's argument label points to it. On Charts,min(a, b)andmax(a, b)used to land on a range type'sminfield and aSequenceextension, andsuper.init(…)on an Objective-C demo'sinitover 170 times. A global in a playground or a test target is no longer linked from the main code. Re-index after upgrading. - In Objective-C, a message now reaches a method only when it could really be sent there. A message to
selforsuperreaches only the sender's class and its superclasses, including categories on UIKit and AppKit views. A C-style call likecompletionBlock()is never taken for a method or property. A message to a local variable uses the variable's declared type (FMResultSet *rs). On SDWebImage,[self class],respondsToSelector:andisKindOfClass:used to land on a proxy class's overrides over 150 times, and on fmdb[rs close]now reaches the result set. - A Swift call through a nested type, like
API.PackageController.GetRoute.query(on: db), now links to that type's method. Onlyqueryused to be kept, so the call linked to whichever type'squerycame first; in a Vapor app every route type has one, so callers, impact andcodegraph_exploreanswers pointed at another endpoint's code. The same applies to nested types' initializers (API.PackageController.Model(name:)), to enum cases (Gitlab.Error.requestFailed(status:)), to types declared in anextension API.PackageController { … }, and to The Composable Architecture'sPath.State.detail(…). A call on a type path that names no type in the project, such as an SDK'sPlot.Node.footer(…), is left unlinked. Re-index Swift projects after upgrading. - A SwiftUI view, a
@mainapp, a view controller and a UIView subclass are now indexed once. Each used to get a second, one-line copy with no callers or calls, which showed up next to the real type in search andcodegraph_exploreanswers as a dead end. Re-index Swift projects after upgrading. - A Swift class or struct that declares a protocol composition across lines, like
typealias Client = AutocompleteService.Clientfollowed by& PostingService.Clienton the next line, is now indexed whole. That line used to break the parse of the entire enclosing type, so its methods, initializer and properties went missing, and calls into them landed on same-named methods elsewhere. Re-index Swift projects after upgrading. - A Swift reference to a type now links to the type's own declaration, not to a file that extends it. An
extension View { … }orextension Text { … }used to stand in for SwiftUI's type, so every view, everyText("…")and everyColor.redin an app linked to whichever file happened to extend it. Those files topped the most-depended-on lists and their impact reached the whole app. A bare name like@State,@TestorResult<…>no longer links to some other type's nestedStateorResult, and a qualified name likeBuild.Idlinks to theIdit names. Methods declared in an extension of an SDK type still resolve on the types that conform to it, and a protocol's methods declared in any of its extensions now connect to each conforming type's own implementation. Re-index Swift projects after upgrading. - A Vapor route now links to the handler it names.
use: SearchController.showused to link to whichever controller'sshowcame first, so routes with a common handler name, likeshow,indexorget, pointed at another endpoint's code in callers, impact andcodegraph_exploreanswers. Nested types likeAPI.PackageController.getand handlers declared in an extension of the controller now resolve too, anduse: self.indexresolves to the collection's ownindex. Re-index Vapor projects after upgrading.
C, C++, Go and Rust
- A call in C code is no longer linked to a C++ class's method, since C has no methods and can't call one. Before, redis's POSIX
read(fd, buf, n)calls and hiredis'sc->funcs->read(…)function pointer pointed at a Qt adapter'sreadmethod. - In Go, a name written through an imported package from outside the module, like
context.Context,http.ResponseWriteror testify'srequire.Contains, is no longer linked to a project symbol of that name. Before, fiber'scontext.Contextparameters pointed at a methodStream.Context, itsrequire.Contains(…)assertions at an extractor'sContains, and gin'shttp.ResponseWriterat its ownResponseWriterinterface. - In Rust,
Self::Errorin a signature now resolves to the enclosing impl's or trait's own associated type. A path through a generic parameter, likeV::Value, no longer resolves to an unrelated struct of that name. Before, serde'sSelf::Errorsignatures pointed at its onestruct Error, and axum'sSelf::Errorataxum-core's error type. - In Rust projects, a struct, handler or service name no longer resolves to an item declared inside some function body, and a file's own item comes before any other crate's. Before, axum's examples'
Urilinked to astruct Urideclared inside a routing test, tokio's runtimeHandlelinked totokio-test's, and ripgrep'sGlob { … }in globset linked to the CLI flags'Glob. - Rust type and function names now follow Rust's scoping. A name from another file counts only when a
usebrings it in (or a*glob over its module). One imported from outside the project, likeuse std::task::{Context, Poll}oruse futures::Stream, means that outside item. A path names its module:io::Resultisn't an unrelatedResultalias elsewhere, andstd::io::Erroris std's. On tokio, over 1,200io::Resultand 600Contextreferences had been landing on private project types. - A C++ call into a macro-opened namespace, like
fmt::format("{}", x), now picks the overload its arguments fit. Before, the first overload indexed won: fmt's 1,400fmt::formatcalls all reached thetext_styleoverload incolor.h. A narrow string literal now fits a narrow format string, a wideL"…"fits the wide overload, and the argument count has to fit too. - C++ classes written around macros and preprocessor conditionals now keep their members. These include an access specifier spelled as a macro (
JSON_PRIVATE_UNLESS_TESTED:), an attribute macro after a template head or a doc comment, and an#ifin the middle of a declaration, such as inside a constructor's initializer list. The first branch of a mid-declaration#ifis the one indexed. nlohmann/json'sbasic_jsonclass used to be lost whole and now has its roughly 390 members. Files with a parse error dropped on redis, curl, pybind11 and leveldb, and no file got worse. Re-index after upgrading. - Calls on a library's own types and modules no longer land on a project method that happens to share the name. In Rust,
Vec::new(),String::from(…)and module paths liketask::spawn(…)stay the standard library's. A later link of a multi-line Rust or Go chain now counts as a chained call, named after the chain's first line. In Go,w.Header().Get(…)is net/http's. In R, a plain call likerange(x)is a function, not an object's method. In JavaScript,response.text()/.json()is fetch's. On tokio,task::spawn(…)used to land onTaskTracker::spawn300 times. On ggplot2,range(…)used to land on a coordinate system'srangemethod. Re-index after upgrading. - In C and C++, a qualified name like
fmt::formatnow reaches a declaration inside a namespace the library opens with a macro, like fmt'sFMT_BEGIN_NAMESPACE, pybind11'sPYBIND11_NAMESPACE_BEGIN(…)or rapidjson's and spdlog's…_NAMESPACE_BEGIN. It also works through a namespace alias likenamespace py = pybind11;. On fmt, 1,728fmt::format(…)calls used to link to nothing, and so did about 1,400py::…calls on pybind11. - In Rust and Go, a call later in a chain, like
sym.filename().map(…)orc.Flags().String(…), no longer lands on the project's own method of that name when the name is a standard-library one (unwrap,clone,map,iter, Go'sStringorError). A plain call likeget(handler)ordrop(x)never lands on a method. On tokio,.map(…)on anOptionused to land onMutexGuard::map; on axum, the router'sget(handler)on a cookie jar'sget; on ripgrep,.clone()on an error type. - In Rust, a bare
Ok(…),Some(…),Err(…),Result<…>,Option<…>,Vec<…>ordrop(…)now means the standard library's, unless the file defines or imports a project item of that name. These used to link to any same-named enum variant or struct in the project: everySome(x)in ripgrep to one enum'sSomevariant, and everyOkandResultin serde to structs its macro-hygiene tests declare. An enum variant is now reached by a bare name only where the fileuses it or its enum's*, and a variant never stands for a type. Re-index Rust projects after upgrading.
PHP, Ruby, Dart, Lua, R, Solidity, Erlang and CFML
- In Laravel apps, a route whose controller is named by string now links to its handler, without needing a
Controllersuffix and keeping the namespace it's written with:'Common\Uploads@inline', andRoute::resource('companies', 'Common\Companies', [...])with an options array. Two same-named controllers in different namespaces are told apart by that namespace. Before, akaunting linked 304 of its 313 routes to nothing. - In Rails apps, a
resourcesline'sonly:andexcept:are now read in every form Rails accepts:%i[new create index],%w(index show), a quoted name, and the older:only => [...]. Before, only a bracketed list was read, so maybe'sresources :family_exports, only: %i[new create index]became all seven routes, four of them to actions the controller doesn't have. - In PHP, a class written with a namespace in its name now links to that class. After
use App\Fields as Field;,new Field\FirstName(),extends Field\BaseandField\FirstName::make()all nameApp\Fields\FirstName, as doFields\FirstNamewritten insidenamespace App;and a fully qualified\App\Fields\FirstName. Before, none of these had a link, so callers and impact missed every class reached that way. Thanks @drakeo338. (#2256) - In Solidity, a call to an overloaded function now reaches the overload whose parameter count it fits, as in the other languages with overloading. Before, OpenZeppelin's
_checkRole(role, _msgSender())inside the one-argument_checkRole(bytes32 role)was linked to itself. - In R, a call like
c(1, 2)is no longer linked to a data variable that happens to share a base function's name, since R skips non-function bindings when it looks up a call. Before, ggplot2's facet tests boundc <- data_frame(b = 3), and everyc(…)call in those files pointed at that data frame. Functions built by a factory, like ggplot2'sgeom_point <- make_constructor(…), still resolve. - A Dart
extension on X { … }with no name is no longer mistaken for the typeX, and its members are reachable only inside the file that declares it, as in Dart. Before, bloc's linter linked analyzer'sTokenand Dart'sUrito small extension blocks, and every flutter_testfind.text(…)call linked to atextgetter on another example'sTaskStatus. - In PHP, an unqualified class name now resolves to the current namespace's class or the one a
useimports, as PHP does. If the imported class comes from a library, it resolves to nothing in the project. Before, koel's form requests linkedextends Requestto whicheverRequestclass was indexed first, and BookStack's controllers linkedRequest $request(Laravel's, by import) to BookStack's ownRequestsubclass. - A Dart call like
ext.endsWith(".avi")ormap.putIfAbsent(…)on a value whose type isn't known now counts as Dart's own String, List or Map method. It no longer lands on a project method of the same name. A Dart extension is also matched by the type it extends, not by its own name, so getx'sext.endsWithon a String stopped reachingextension RxStringExt on Rx<String>. - A bare Lua call like
ipairs(t),error("…")or busted'ssetup()now means Lua's own function unless the file defines one. It no longer lands on a table method of the same name: telescope'sipairscalls had gone to a linked list'sipairs, and kong'serrorcalls to its response module. A function's own alias of a host table member, likelocal get_query = kong.request.get_query, is now followed as well. - Lua calls made through a
localalias now reach the function it names. That coverslocal splitn = require("kong.tools.string").splitn, a module member such asutils.select_listener, and a function a module exports under another name (return { check = check_phase }). Aliases of Lua's own functions, such aslocal type = typeorlocal fmt = string.format, no longer show up as calls into your project. On Kong that is over 1,000 calls that now reach their real function, and about 5,000 fewer dead-end edges. - In Solidity, a call with no receiver now reaches a function of the contract around it or of one it inherits. On OpenZeppelin,
_msgSender()in contracts built onContextused to land onERC2771Context's override 83 times. In Erlang, a call to another module's function now follows the file's-import(Mod, [f/N]). On cowboy,-import(req_SUITE, [do_get/3])calls used to land on another suite'sdo_get/3. A bare call with no such import no longer links to some other module. Re-index after upgrading. - In Lua and Luau, a call through a standard or host library table (
string,table,io,vim,ngx, busted'sassert…) or a string method likeline:find(…)no longer lands on the one project method with the same name. Functions the project itself defines on those tables still link. On kong, the specs'assert.truthy(…)andassert.falsy(…)used to land on a condition helper over 1,700 times; on telescope,line:find(…)on the picker'sfind. - In PHP, a call through a variable nothing types no longer lands on an unrelated class's method just because it's the only method with that name. The variable now needs to be named after the method's class, or after a class that inherits it (
$page->save()wherePageextendsEntity). On guzzle, the tests'$response->getHeaderLine()used to land on a test double; on symfony/console,$e->getMessage()on a progress bar. - In CFML, a call no longer lands on an unrelated component's method just because the name matches. A call with no receiver inside a component now reaches only that component's methods and those of the components it extends, so built-ins like
now()stay built-ins. A call on an untyped variable now needs the variable to be named after the component, soserver.keyExists(…)is no longer taken for some component'skeyExists. On coldbox,now()used to land on a date helper over 200 times, and TestBox'sfail(…)in specs now reaches the spec base class. - In Ruby, a call no longer lands on an unrelated class's method just because it's the only method with that name. A call on an untyped receiver now needs the receiver to be named after the method's class, like
web_push_request.legacy_encrypt. A call with no receiver inside a class now reaches only that class's methods, its superclasses' methods, and those of the modules it includes, extends or prepends. On rubocop,node.locon a syntax node used to land on the project's onelocmethod over 1,200 times, and Kernel'sformat(…)on the language server'sformat. On mastodon,renderin controllers used to land on an inline renderer, andauthorizenow reaches the authorization concern. - In Dart, a call written without a receiver now reaches only a method of the class it's written in, of a class it extends, mixes in or implements, or of an extension on one of those types, and picks the nearest one. On riverpod, package:test's
test(…)in the test files used to land on a container class'stestmethod over 1,100 times, shelf's and getx'sexpect(…)on unrelated classes'expect, and bloc'semit(…)in a Cubit on the wrong base class. Classes declared asclass A = B with C;are now indexed under their name, with what they extend and mix in. Re-index after upgrading. - In R, a variable assigned at the top of a test file is no longer linked from the package or from other tests, because testthat runs each test file in its own environment. On ggplot2, a test's
c <- ggplot(…)used to collect 2,455 of the package'sc(…)calls. Variables inhelper-*.Randsetup-*.R, which testthat loads for every test, are still shared. - In Lua and Luau, a
localvariable or function is no longer linked from other files, since it's only visible in the file that declares it. On kong, a spec helper'slocal it = itused to collect every other spec file'sit(…)(over 4,000 links), and one module'slocal ipairs = ipairstook the whole project'sipairs(…). Global functions are still linked across files. - PHP calls on
$this,self,staticandparentnow reach the method of the class they're written in, a class it extends, or a trait any of them uses, with parent classes and traits found through the file'snamespaceanduseimports. On Drupal core,$this->assertEquals()(PHPUnit's) used to link to an unrelated comparator class 8,832 times,$this->assertSession()to a JavaScript-test base class, and$this->t()toViews::t. They now reachUiHelperTraitandStringTranslationTrait, or nothing when the method lives in a package outside the repository. A call inside a trait, and a base class calling a method its subclass defines, keep their links. Re-index PHP projects after upgrading. - A PHP function call written after
=>in an array, like'count' => count($items),'by' => user()->idor'label' => trans('…'), is now read as a plain function call. It used to be taken for a method call and linked to whichever class had a method of that name. On BookStack, that meant 166 wrong links. - A PHP call written without a receiver, such as
redirect($url),view('books.show'),auth()orbasename($path), is a function call, and no longer links to a same-named method, field or class elsewhere in the project. These wrong links showed up in callers, impact andcodegraph_exploreanswers wherever a Laravel helper or PHP built-in shared its name with a project member. Re-index PHP projects after upgrading.