[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