[code-reflection] RFR: JavaRef extends TypeElement
Paul Sandoz
psandoz at openjdk.org
Tue Apr 29 22:30:35 UTC 2025
Each implementation of `JavaRef` supports an external form, using the sigil prefix `&` to indicate a reference of some kind.
The externalized form of `TypeVarRef` is changed to be uniformly structured. This required update to the code model text of a few tests. Arguably we are taking a step back in terms of readability, but we can address that later - it was easier to update a few tests rather than preserve the existing encoding in a few places.
We still rely on the bespoke string form for java refs, which is used as the value of an externalized attribute. Ideally such attribute values are either instances of `JavaRef` or `ExternalizedTypeElement` to be transformed into the appropriate `JavaRef`. We can address that later to further separate out parsing.
I believe we have what we need to further enhance the code model builder to not rely on bespoke parsing logic of Java types. We can either construct `ExternalizedTypeElement` tree instances explicitly or parse from a very simple grammar. If we are careful i believe we can share the results of nested type elements if reused e.g. as in `List<Double>` and `Set<Double>`.
More generally it now means we can generate a simple s-expression-like tree for the whole code model, e.g., a string where the `(` and `)` characters represent tree structure and say `L` represents a leaf node, and a list of leaf node values in topological order.
--
Below is the type grammar, which i believe is consistent with what we have implemented.
# Type element grammar
## General structure
identifier
string
name
identifier
sigil
# | . | & | + | - | [
type
sigil
identifier
sigil identifier
identifier < types >
sigil identifier < types >
types
type
type , types
## Core types
varType
"var" < type >
tupleType
"tuple"
"tuple" < types >
funcType
"func" < types >
# Java types
javaType
primitiveType | classType | wildCardType | arrayType | typeVariableType
javaType-no-wildCardType
primitiveType | classType | arrayType | typeVariableType
primitiveType
boolean | byte | ... | void
classType
name
name < paramTypes >
. < enclosingType , innerType >
paramTypes
javaType
javaType , javaTypes
enclosingType
classType
innerType
classType
wildcardType
+ < wildcardTypeBound >
- < wildcardTypeBound >
wildcardTypeBound
javaType-no-wildCardType
arrayType
dims < javaType >
dims
[
[ dims
typeVariableType
"#" name < typeVariableTypeOwner , typeVariableTypeBound >
typeVariableTypeOwner
classType | methodRef | constructorRef
typeVariableTypeBound
javaType-no-wildCardType
## Java refs
methodRef
& "m" < type , name , funcType >
constructorRef
& "c" < funcType >
fieldRef
& "f" < type , name , type >
recordRef
& "r" < type >
& "r" < type , recordRefComponentTypes >
recordRefComponentTypes
type , name
type , name , recordRefComponentTypes
-------------
Commit messages:
- Remove comment.
- Remove redundant code.
- JavaRef extends TypeElement
Changes: https://git.openjdk.org/babylon/pull/416/files
Webrev: https://webrevs.openjdk.org/?repo=babylon&pr=416&range=00
Stats: 291 lines in 14 files changed: 214 ins; 22 del; 55 mod
Patch: https://git.openjdk.org/babylon/pull/416.diff
Fetch: git fetch https://git.openjdk.org/babylon.git pull/416/head:pull/416
PR: https://git.openjdk.org/babylon/pull/416
More information about the babylon-dev
mailing list