Skip to content

Commit 9da8641

Browse files
authored
fix(schema): admit L4's compound body-node ids so an -a 4 payload validates (#208)
The localId pattern was written before L4 and admitted only a bare line:col or an @-tagged synthetic vertex. SdgVertices keys a call site's actuals off the site's own local id — <line:col>/actual_in:<i> and <line:col>/actual_out — so every one of them was rejected and an -a 4 document failed this repository's own conformance gate: 2936 errors on daytrader8, all of them these two forms. The pattern now enumerates the two compound forms rather than loosening its character class, so ids no builder emits are still rejected: an actual_in missing its ordinal, an actual_out carrying one, an unknown suffix, a base that is not a position, and a bare trailing slash all remain invalid. The emitted ids were correct throughout; only the schema describing them was stale. -a 1, -a 2 and -a 3 documents already validated, which also settles the question the issue raised about whether lower levels shared the gap. L4GateTest now validates the real -a 4 document it already builds, and L4SchemaOracleTest covers the accept and reject cases directly. Closes #207
1 parent b92e3e9 commit 9da8641

144 files changed

Lines changed: 10831 additions & 2 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.$neo4j-schema.drawio.bkp

Lines changed: 115 additions & 0 deletions
Large diffs are not rendered by default.

.astro/collections/docs.schema.json

Lines changed: 650 additions & 0 deletions
Large diffs are not rendered by default.

.astro/content-assets.mjs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export default new Map();

.astro/content-modules.mjs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
2+
export default new Map([
3+
["src/content/docs/contributing.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2Fcontributing.mdx&astroContentModuleFlag=true")],
4+
["src/content/docs/index.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2Findex.mdx&astroContentModuleFlag=true")],
5+
["src/content/docs/installing.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2Finstalling.mdx&astroContentModuleFlag=true")],
6+
["src/content/docs/schema.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2Fschema.mdx&astroContentModuleFlag=true")],
7+
["src/content/docs/quickstart.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2Fquickstart.mdx&astroContentModuleFlag=true")],
8+
["src/content/docs/frameworks/entry-points.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2Fframeworks%2Fentry-points.mdx&astroContentModuleFlag=true")],
9+
["src/content/docs/frameworks/crud.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2Fframeworks%2Fcrud.mdx&astroContentModuleFlag=true")],
10+
["src/content/docs/troubleshooting.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2Ftroubleshooting.mdx&astroContentModuleFlag=true")],
11+
["src/content/docs/what-is-codeanalyzer.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2Fwhat-is-codeanalyzer.mdx&astroContentModuleFlag=true")],
12+
["src/content/docs/guides/analysis-levels.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2Fguides%2Fanalysis-levels.mdx&astroContentModuleFlag=true")],
13+
["src/content/docs/guides/architecture.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2Fguides%2Farchitecture.mdx&astroContentModuleFlag=true")],
14+
["src/content/docs/guides/build-integration.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2Fguides%2Fbuild-integration.mdx&astroContentModuleFlag=true")],
15+
["src/content/docs/guides/incremental-analysis.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2Fguides%2Fincremental-analysis.mdx&astroContentModuleFlag=true")],
16+
["src/content/docs/integration/python-sdk.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2Fintegration%2Fpython-sdk.mdx&astroContentModuleFlag=true")],
17+
["src/content/docs/reference/examples.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2Freference%2Fexamples.mdx&astroContentModuleFlag=true")],
18+
["src/content/docs/reference/cli.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2Freference%2Fcli.mdx&astroContentModuleFlag=true")],
19+
["src/content/docs/schema/call-graph.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2Fschema%2Fcall-graph.mdx&astroContentModuleFlag=true")],
20+
["src/content/docs/schema/symbol-table.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2Fschema%2Fsymbol-table.mdx&astroContentModuleFlag=true")]]);
21+

.astro/content.d.ts

Lines changed: 218 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,218 @@
1+
declare module 'astro:content' {
2+
interface Render {
3+
'.mdx': Promise<{
4+
Content: import('astro').MDXContent;
5+
headings: import('astro').MarkdownHeading[];
6+
remarkPluginFrontmatter: Record<string, any>;
7+
components: import('astro').MDXInstance<{}>['components'];
8+
}>;
9+
}
10+
}
11+
12+
declare module 'astro:content' {
13+
export interface RenderResult {
14+
Content: import('astro/runtime/server/index.js').AstroComponentFactory;
15+
headings: import('astro').MarkdownHeading[];
16+
remarkPluginFrontmatter: Record<string, any>;
17+
}
18+
interface Render {
19+
'.md': Promise<RenderResult>;
20+
}
21+
22+
export interface RenderedContent {
23+
html: string;
24+
metadata?: {
25+
imagePaths: Array<string>;
26+
[key: string]: unknown;
27+
};
28+
}
29+
}
30+
31+
declare module 'astro:content' {
32+
type Flatten<T> = T extends { [K: string]: infer U } ? U : never;
33+
34+
export type CollectionKey = keyof AnyEntryMap;
35+
export type CollectionEntry<C extends CollectionKey> = Flatten<AnyEntryMap[C]>;
36+
37+
export type ContentCollectionKey = keyof ContentEntryMap;
38+
export type DataCollectionKey = keyof DataEntryMap;
39+
40+
type AllValuesOf<T> = T extends any ? T[keyof T] : never;
41+
type ValidContentEntrySlug<C extends keyof ContentEntryMap> = AllValuesOf<
42+
ContentEntryMap[C]
43+
>['slug'];
44+
45+
export type ReferenceDataEntry<
46+
C extends CollectionKey,
47+
E extends keyof DataEntryMap[C] = string,
48+
> = {
49+
collection: C;
50+
id: E;
51+
};
52+
export type ReferenceContentEntry<
53+
C extends keyof ContentEntryMap,
54+
E extends ValidContentEntrySlug<C> | (string & {}) = string,
55+
> = {
56+
collection: C;
57+
slug: E;
58+
};
59+
export type ReferenceLiveEntry<C extends keyof LiveContentConfig['collections']> = {
60+
collection: C;
61+
id: string;
62+
};
63+
64+
/** @deprecated Use `getEntry` instead. */
65+
export function getEntryBySlug<
66+
C extends keyof ContentEntryMap,
67+
E extends ValidContentEntrySlug<C> | (string & {}),
68+
>(
69+
collection: C,
70+
// Note that this has to accept a regular string too, for SSR
71+
entrySlug: E,
72+
): E extends ValidContentEntrySlug<C>
73+
? Promise<CollectionEntry<C>>
74+
: Promise<CollectionEntry<C> | undefined>;
75+
76+
/** @deprecated Use `getEntry` instead. */
77+
export function getDataEntryById<C extends keyof DataEntryMap, E extends keyof DataEntryMap[C]>(
78+
collection: C,
79+
entryId: E,
80+
): Promise<CollectionEntry<C>>;
81+
82+
export function getCollection<C extends keyof AnyEntryMap, E extends CollectionEntry<C>>(
83+
collection: C,
84+
filter?: (entry: CollectionEntry<C>) => entry is E,
85+
): Promise<E[]>;
86+
export function getCollection<C extends keyof AnyEntryMap>(
87+
collection: C,
88+
filter?: (entry: CollectionEntry<C>) => unknown,
89+
): Promise<CollectionEntry<C>[]>;
90+
91+
export function getLiveCollection<C extends keyof LiveContentConfig['collections']>(
92+
collection: C,
93+
filter?: LiveLoaderCollectionFilterType<C>,
94+
): Promise<
95+
import('astro').LiveDataCollectionResult<LiveLoaderDataType<C>, LiveLoaderErrorType<C>>
96+
>;
97+
98+
export function getEntry<
99+
C extends keyof ContentEntryMap,
100+
E extends ValidContentEntrySlug<C> | (string & {}),
101+
>(
102+
entry: ReferenceContentEntry<C, E>,
103+
): E extends ValidContentEntrySlug<C>
104+
? Promise<CollectionEntry<C>>
105+
: Promise<CollectionEntry<C> | undefined>;
106+
export function getEntry<
107+
C extends keyof DataEntryMap,
108+
E extends keyof DataEntryMap[C] | (string & {}),
109+
>(
110+
entry: ReferenceDataEntry<C, E>,
111+
): E extends keyof DataEntryMap[C]
112+
? Promise<DataEntryMap[C][E]>
113+
: Promise<CollectionEntry<C> | undefined>;
114+
export function getEntry<
115+
C extends keyof ContentEntryMap,
116+
E extends ValidContentEntrySlug<C> | (string & {}),
117+
>(
118+
collection: C,
119+
slug: E,
120+
): E extends ValidContentEntrySlug<C>
121+
? Promise<CollectionEntry<C>>
122+
: Promise<CollectionEntry<C> | undefined>;
123+
export function getEntry<
124+
C extends keyof DataEntryMap,
125+
E extends keyof DataEntryMap[C] | (string & {}),
126+
>(
127+
collection: C,
128+
id: E,
129+
): E extends keyof DataEntryMap[C]
130+
? string extends keyof DataEntryMap[C]
131+
? Promise<DataEntryMap[C][E]> | undefined
132+
: Promise<DataEntryMap[C][E]>
133+
: Promise<CollectionEntry<C> | undefined>;
134+
export function getLiveEntry<C extends keyof LiveContentConfig['collections']>(
135+
collection: C,
136+
filter: string | LiveLoaderEntryFilterType<C>,
137+
): Promise<import('astro').LiveDataEntryResult<LiveLoaderDataType<C>, LiveLoaderErrorType<C>>>;
138+
139+
/** Resolve an array of entry references from the same collection */
140+
export function getEntries<C extends keyof ContentEntryMap>(
141+
entries: ReferenceContentEntry<C, ValidContentEntrySlug<C>>[],
142+
): Promise<CollectionEntry<C>[]>;
143+
export function getEntries<C extends keyof DataEntryMap>(
144+
entries: ReferenceDataEntry<C, keyof DataEntryMap[C]>[],
145+
): Promise<CollectionEntry<C>[]>;
146+
147+
export function render<C extends keyof AnyEntryMap>(
148+
entry: AnyEntryMap[C][string],
149+
): Promise<RenderResult>;
150+
151+
export function reference<C extends keyof AnyEntryMap>(
152+
collection: C,
153+
): import('astro/zod').ZodEffects<
154+
import('astro/zod').ZodString,
155+
C extends keyof ContentEntryMap
156+
? ReferenceContentEntry<C, ValidContentEntrySlug<C>>
157+
: ReferenceDataEntry<C, keyof DataEntryMap[C]>
158+
>;
159+
// Allow generic `string` to avoid excessive type errors in the config
160+
// if `dev` is not running to update as you edit.
161+
// Invalid collection names will be caught at build time.
162+
export function reference<C extends string>(
163+
collection: C,
164+
): import('astro/zod').ZodEffects<import('astro/zod').ZodString, never>;
165+
166+
type ReturnTypeOrOriginal<T> = T extends (...args: any[]) => infer R ? R : T;
167+
type InferEntrySchema<C extends keyof AnyEntryMap> = import('astro/zod').infer<
168+
ReturnTypeOrOriginal<Required<ContentConfig['collections'][C]>['schema']>
169+
>;
170+
171+
type ContentEntryMap = {
172+
173+
};
174+
175+
type DataEntryMap = {
176+
"docs": Record<string, {
177+
id: string;
178+
body?: string;
179+
collection: "docs";
180+
data: InferEntrySchema<"docs">;
181+
rendered?: RenderedContent;
182+
filePath?: string;
183+
}>;
184+
185+
};
186+
187+
type AnyEntryMap = ContentEntryMap & DataEntryMap;
188+
189+
type ExtractLoaderTypes<T> = T extends import('astro/loaders').LiveLoader<
190+
infer TData,
191+
infer TEntryFilter,
192+
infer TCollectionFilter,
193+
infer TError
194+
>
195+
? { data: TData; entryFilter: TEntryFilter; collectionFilter: TCollectionFilter; error: TError }
196+
: { data: never; entryFilter: never; collectionFilter: never; error: never };
197+
type ExtractDataType<T> = ExtractLoaderTypes<T>['data'];
198+
type ExtractEntryFilterType<T> = ExtractLoaderTypes<T>['entryFilter'];
199+
type ExtractCollectionFilterType<T> = ExtractLoaderTypes<T>['collectionFilter'];
200+
type ExtractErrorType<T> = ExtractLoaderTypes<T>['error'];
201+
202+
type LiveLoaderDataType<C extends keyof LiveContentConfig['collections']> =
203+
LiveContentConfig['collections'][C]['schema'] extends undefined
204+
? ExtractDataType<LiveContentConfig['collections'][C]['loader']>
205+
: import('astro/zod').infer<
206+
Exclude<LiveContentConfig['collections'][C]['schema'], undefined>
207+
>;
208+
type LiveLoaderEntryFilterType<C extends keyof LiveContentConfig['collections']> =
209+
ExtractEntryFilterType<LiveContentConfig['collections'][C]['loader']>;
210+
type LiveLoaderCollectionFilterType<C extends keyof LiveContentConfig['collections']> =
211+
ExtractCollectionFilterType<LiveContentConfig['collections'][C]['loader']>;
212+
type LiveLoaderErrorType<C extends keyof LiveContentConfig['collections']> = ExtractErrorType<
213+
LiveContentConfig['collections'][C]['loader']
214+
>;
215+
216+
export type ContentConfig = typeof import("../src/content.config.js");
217+
export type LiveContentConfig = never;
218+
}

.astro/types.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
/// <reference types="astro/client" />
2+
/// <reference path="content.d.ts" />

.github/workflows/pypi-release.yml

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
# Build fat platform wheels (bundled JVM via jpackage), publish them as GitHub
2+
# release assets, and serve a PEP 503 index from GitHub Pages so users can:
3+
# pip install codeanalyzer-java --extra-index-url <pages-url>/simple/
4+
#
5+
# No PyPI upload (the wheels exceed PyPI's 100 MB limit); GitHub release assets
6+
# allow up to 2 GB and let us use plain linux_x86_64 tags.
7+
name: pypi-release
8+
9+
on:
10+
release:
11+
types: [published]
12+
workflow_dispatch:
13+
inputs:
14+
tag:
15+
description: "Existing release tag to (re)build wheels for, e.g. v2.4.0"
16+
required: true
17+
18+
permissions:
19+
contents: write # upload wheels to the release
20+
pages: write # publish the simple index
21+
id-token: write # GitHub Pages deployment
22+
23+
env:
24+
TAG: ${{ github.event.release.tag_name || inputs.tag }}
25+
26+
jobs:
27+
build:
28+
name: wheel (${{ matrix.plat }})
29+
strategy:
30+
fail-fast: false
31+
matrix:
32+
include:
33+
- { runner: macos-14, plat: macosx_11_0_arm64 }
34+
- { runner: macos-13, plat: macosx_10_9_x86_64 }
35+
- { runner: ubuntu-latest, plat: linux_x86_64 }
36+
- { runner: ubuntu-24.04-arm, plat: linux_aarch64 }
37+
- { runner: windows-latest, plat: win_amd64 }
38+
runs-on: ${{ matrix.runner }}
39+
defaults:
40+
run:
41+
shell: bash
42+
steps:
43+
- uses: actions/checkout@v5
44+
with:
45+
ref: ${{ env.TAG }}
46+
47+
# A standard JDK (NOT GraalVM): jpackage bundles HotSpot for full fidelity.
48+
- uses: actions/setup-java@v5
49+
with:
50+
distribution: temurin
51+
java-version: "21"
52+
53+
- uses: actions/setup-python@v6
54+
with:
55+
python-version: "3.12"
56+
57+
- name: Build the analyzer jar
58+
run: ./gradlew fatJar
59+
60+
- name: jpackage app-image (trimmed JVM + jar)
61+
run: |
62+
VER=$(grep '^version=' gradle.properties | cut -d= -f2)
63+
echo "VER=$VER" >> "$GITHUB_ENV"
64+
jpackage --type app-image \
65+
--name codeanalyzer \
66+
--input build/libs \
67+
--main-jar "codeanalyzer-${VER}.jar" \
68+
--main-class com.ibm.cldk.CodeAnalyzer \
69+
--java-options -XX:+UseParallelGC \
70+
--dest build/jpackage
71+
72+
- name: Pack platform wheel
73+
env:
74+
# Wheel version comes from the release tag (strip leading v); fall back to jar version.
75+
CODEANALYZER_VERSION: ${{ env.VER }}
76+
run: |
77+
python -m pip install --upgrade pip setuptools wheel build
78+
python packaging/pypi/build_wheel.py \
79+
--runtime build/jpackage \
80+
--plat-name ${{ matrix.plat }}
81+
82+
- uses: actions/upload-artifact@v7
83+
with:
84+
name: wheel-${{ matrix.plat }}
85+
path: packaging/pypi/dist/*.whl
86+
87+
publish:
88+
name: index + release upload
89+
needs: build
90+
runs-on: ubuntu-latest
91+
steps:
92+
- uses: actions/checkout@v5
93+
- uses: actions/setup-python@v6
94+
with:
95+
python-version: "3.12"
96+
97+
- uses: actions/download-artifact@v8
98+
with:
99+
path: artifacts
100+
pattern: wheel-*
101+
merge-multiple: true
102+
103+
- name: Collect wheels
104+
run: |
105+
mkdir -p dist
106+
find artifacts -name '*.whl' -exec cp {} dist/ \;
107+
ls -lh dist
108+
109+
- name: Generate PEP 503 simple index
110+
run: |
111+
python packaging/pypi/gen_index.py \
112+
--wheels dist \
113+
--base-url "https://github.com/${{ github.repository }}/releases/download/${TAG}" \
114+
--out public
115+
116+
- name: Attach wheels to the release
117+
run: gh release upload "${TAG}" dist/*.whl --clobber
118+
env:
119+
GH_TOKEN: ${{ github.token }}
120+
121+
- uses: actions/upload-pages-artifact@v5
122+
with:
123+
path: public
124+
125+
deploy-pages:
126+
name: deploy index to Pages
127+
needs: publish
128+
runs-on: ubuntu-latest
129+
environment:
130+
name: github-pages
131+
url: ${{ steps.deployment.outputs.page_url }}
132+
steps:
133+
- id: deployment
134+
uses: actions/deploy-pages@v5

0 commit comments

Comments
 (0)