[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