Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Jep 430 String template - Grammar, AST and codegen changes #1513

Merged
merged 1 commit into from Nov 30, 2023

Conversation

jarthana
Copy link
Member

Issue #544

What it does

Fixes #544

How to test

Author checklist

@jarthana
Copy link
Member Author

jarthana commented Nov 6, 2023

The failures in DietRecoveryTest are recovery related and I think we can simply adjust the tests here. However, the ones in NullAnnotationTest need attention. They arise because we are triggering initialization of null analysis and thus resolution of annotations much earlier. I..e at the time of computing default imports itself. Either we need to

  1. ensure the null analysis is not prematurely triggered or
  2. instead of adding an import, replace "STR" or "RAW" with their qualified names. (I haven't tried this though)

Copy link
Contributor

@srikanth-sankaran srikanth-sankaran left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

First batch of comments.

/.$putCase consumeTemplateExpressionWithPrimary(); $break ./
/:$readableName TemplateExpression:/
/:$compliance 21:/

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The production with Primary widens things, but may still leave us short of all possible expressions denoting a processor, but we can tackle this later.

@srikanth-sankaran
Copy link
Contributor

srikanth-sankaran commented Nov 7, 2023

A major recommendation is to:

  1. Come up with a method jumpOverEmbeddedExpression modelled after jumpOverMethodBody (best not to completely duplicate this method, but define a customizable method jumpToMatchingBrace that can be called by both
  2. This method should continue to maintain withoutUnicodeBuffer and withoutUnicodePtr as needed.
  3. Maintain co-ordinates of fragments and expression relative to string start rather than relative to source, this way if we find unicodes and switch to alternate buffering, the already recorded offsets will still be valid.
  4. The recorded offsets need to be string relative if withoutUnicodePtr == 0 and will simply be withoutUnicodePtr itself if the string has any unicodes

This, if can be made to fly can significantly simplify the implementation.

I know that is a big if 🤣

@jarthana
Copy link
Member Author

jarthana commented Nov 8, 2023

A major recommendation is to:

1. Come up with a method `jumpOverEmbeddedExpression` modelled after `jumpOverMethodBody` (best not to completely duplicate this method, but define a customizable method `jumpToMatchingBrace` that can be called by both

I played around a bit. While it works well for most cases, it is confused with cases like this:
String s = STR."\{ STR."\{ STR."}abc{" }" }";

To make it work, we should make it aware of the nested {} too, that might make it more complicated than it is now.

@srikanth-sankaran
Copy link
Contributor

A major recommendation is to:

1. Come up with a method `jumpOverEmbeddedExpression` modelled after `jumpOverMethodBody` (best not to completely duplicate this method, but define a customizable method `jumpToMatchingBrace` that can be called by both

I played around a bit. While it works well for most cases, it is confused with cases like this: String s = STR."\{ STR."\{ STR."}abc{" }" }";

To make it work, we should make it aware of the nested {} too, that might make it more complicated than it is now.

Can you pick up the changes from #1571 - this passes all tests and in this change jumpOverMethodBody calls scanForStringLiteral which should automatically handle the case you cite

@jarthana
Copy link
Member Author

I noticed we report an explicit import of STR as unused import. This import should be marked as used or ignored.

@jarthana jarthana changed the title Jep 430 String template - WIP patch Jep 430 String template - Grammar, AST and codegen changes Nov 16, 2023
@mpalat
Copy link
Contributor

mpalat commented Nov 28, 2023

  1. The DOM nodes need more thoughts on handling the string literals and text blocks that will not have the delimiters such as " or """.

capturing the essence of an offline discussion with @jarthana here [also to show to management that I am not whiling away time :) ]
(1) A list of nodes without regard to correctness is one option what we discussed. This is probably the simplest solution - leave the correctness questions [eg: is there an expression immediately after String etc] to the compiler.

(2) Alternatively, I feel, something akin to VariableDeclarationFragment may be suited for this. Essentially, this would be a StringDeclarationFragment having two properties - one for the string fragment and the other for the expression - the embedded expression - the { and } will have to be handled. There is a clear demarkation of what is String and What is Expression, so that setting can be done separately. Agree that there will be an odd man out, but this is not an issue -think of a variable without an initialiser. It would also mean continuity in source range [satisfying the source range verifier] which was one of the issues Jay raised.

  • 2 cents.

@jarthana
Copy link
Member Author

jarthana commented Nov 29, 2023

In the interest of getting this out to users and have it tested enough, I plan to push these changes tomorrow. I have taken out the DOM changes and plan to take it via #1537.
Other than the DOM part, what needs work is the code assist. I have tested that assist (including completion) works around string templates (but just not inside them).

@jarthana jarthana force-pushed the jep430_alter branch 2 times, most recently from 3fcf310 to 7011ab2 Compare November 30, 2023 06:12
@mpalat
Copy link
Contributor

mpalat commented Nov 30, 2023

I have taken out the DOM changes and plan to take it via #1537.
@jarthana I guess you meant the PR number of the DOM changes?

Grammar, compiler AST, resolution and code generation changes
@jarthana jarthana merged commit b2cad64 into eclipse-jdt:master Nov 30, 2023
9 checks passed
iloveeclipse added a commit to iloveeclipse/eclipse.jdt.core that referenced this pull request Dec 2, 2023
The change in bytecode of FullSourceWorkspaceBuildTests is due the
constant value change of
o.e.jdt.internal.compiler.parser.TerminalTokens.TokenNameEOF coming
from eclipse-jdt#1513.

Fixes eclipse-platform/eclipse.platform.releng.aggregator#1617
iloveeclipse added a commit to iloveeclipse/eclipse.jdt.core that referenced this pull request Dec 2, 2023
The change in bytecode of FullSourceWorkspaceBuildTests is due the
constant value change of
o.e.jdt.internal.compiler.parser.TerminalTokens.TokenNameEOF coming
from eclipse-jdt#1513.

Fixes eclipse-platform/eclipse.platform.releng.aggregator#1617
iloveeclipse added a commit that referenced this pull request Dec 2, 2023
The change in bytecode of FullSourceWorkspaceBuildTests is due the
constant value change of
o.e.jdt.internal.compiler.parser.TerminalTokens.TokenNameEOF coming
from #1513.

Fixes eclipse-platform/eclipse.platform.releng.aggregator#1617
@stephan-herrmann
Copy link
Contributor

The failures in DietRecoveryTest are recovery related and I think we can simply adjust the tests here. However, the ones in NullAnnotationTest need attention. They arise because we are triggering initialization of null analysis and thus resolution of annotations much earlier. I..e at the time of computing default imports itself. Either we need to

  1. ensure the null analysis is not prematurely triggered or
  2. instead of adding an import, replace "STR" or "RAW" with their qualified names. (I haven't tried this though)

@jarthana I happen to see this just now. Does early triggering initialization of null analysis still happen with the released change? If so, could you point me to the code change causing this? "Doing things too early" is a constant concern in the implementation of null analysis ...

@jarthana
Copy link
Member Author

jarthana commented Dec 4, 2023

NullAnnotationTest

I have added a kludge in CUScope, line number 772:
this.environment.globalOptions.isAnnotationBasedNullAnalysisEnabled = false;

If you comment out this code and run the NullAnnotationTest, you will see some tests failing.

@jarthana jarthana deleted the jep430_alter branch December 6, 2023 07:04
noopur2507 pushed a commit that referenced this pull request Dec 15, 2023
Grammar, compiler AST, resolution and code generation changes
noopur2507 pushed a commit that referenced this pull request Dec 15, 2023
The change in bytecode of FullSourceWorkspaceBuildTests is due the
constant value change of
o.e.jdt.internal.compiler.parser.TerminalTokens.TokenNameEOF coming
from #1513.

Fixes eclipse-platform/eclipse.platform.releng.aggregator#1617
mpalat added a commit that referenced this pull request Dec 19, 2023
* configure default output.. = bin/

* JavaSearchScope: improve encloses() performance  #474

* [test] remove outdated latestBREE project

* fix some ecj markers

Especially after moving files to compiler.batch - which has no resource
warnings - the @SuppressWarnings("resource") is not used - leading to a
marker

* Single async "Synchronizing projects" Job #419

Scheduling multiple times "while the job is running, the job will still
only be rescheduled once" (javadoc) so there will be always only a
single job running.
Using a Set prevents touching projects multiple times.

#419

Manually tested by changing Compiler Building options "Circular
dependencies", which triggers a new build.

* [test] fix AbstractJavaModelTests #1333

avoid asynchronous refresh. Implementation taken from
org.eclipse.core.tests.resources.refresh.RefreshProviderTest.joinAutoRefreshJobs()

#1333

* TestVerifier: never wait 100ms

improve test time, accurate timeout

* [performance] ClassFileReader: use already open Zip File

instead of creating new ZipFile instance.

also:
* use Files.readAllBytes
* removed unused code
* faster toUri avoiding isDirectory() check for the JARs which are known
to be no directory

improves performance of read() on windows by factor 2
tested with java reference search to java.lang.Object

* Stop skipping compare-with-baseline for jdt.annotation v2

One less thing that has to be manually tracked and done.

* Version bump for jdt.annotation

Pointed by
https://download.eclipse.org/eclipse/downloads/drops4/I20231130-0020/buildlogs/reporeports/reports/versionChecks.html

* Fix github urls in NOTICE file

* Use try-with-resource and enable warning if not

org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning

StringWriter does not need flush() or close() and can not throw
IOException.

Tests excluded.

To get rid of boiler plate code.

* version bumps

* [21] JEP 430 String Templates (#1513)

Grammar, compiler AST, resolution and code generation changes

* Javadoc: fix unclosed <code>

* break from loop within labeled block causes loss of nullness info (#1660)

fixes #1659

* Fixes incorrect Javadoc after StringBuffer to StringBuilder change

* NPE in ASTRewriteFlattener as return value of GuardedPattern.getPattern() is null  (#1647)

NPE in ASTRewriteFlattener as return value of
GuardedPattern.getPattern() is null

* Adding pomless build to JDT core

This enables pomless builds for JDT coreand removes the simple pom
files.

Future commits can reduce the usage of pom files further. This might
require enhancements in pomless builds to specify the test classes and
suites eclipse-tycho/tycho#3105

* Using Simplify lambda expression and method reference syntax cleanup on
core

Using the JDT UI "Simplify lambda expression and method reference
syntax" clean-up on jdt.core.

* Internal compiler error: ArrayIndexOutOfBoundsException in latest i build (#1664)


fixes #1661

* Using Simplify lambda expression and method reference syntax cleanup on
all plug-ins except core

Using the JDT UI "Simplify lambda expression and method reference
syntax" clean-up on all plug-ins except jdt.core.

* Using short-circuit in IncrementalImageBuilder

* Re-normalize line-endings in git of all files to Linux style ("\n")

Some files were checked-in into git having windows style line
endings (\r\n). This is in general not wanted because it can cause
modified files without any difference in git-staging on Windows if
auto-crlf is enabled.

To re-normalize line endings of all files use the following command
(including dot):

git add --renormalize .

* Bump bundle dependencies to trigger a rebuild / fix SDK build error

The change in bytecode of FullSourceWorkspaceBuildTests is due the
constant value change of
o.e.jdt.internal.compiler.parser.TerminalTokens.TokenNameEOF coming
from #1513.

Fixes eclipse-platform/eclipse.platform.releng.aggregator#1617

* False positive "Dead code" compiler error reported on org.eclipse.pde.internal.core.util.PDEJavaHelper.getExternalPackageFragment(String, String) (#1671)

fixes #1667

* Use diamond operator in jdt.core repo

Using the JDT UI clean-up, this removes the redundant type information.

Also activating
org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warning
The rest of the changes in the prefs file were done by the tooling, not
by
selecting anther value.

* Improve constructor completions inside method invocations Fix #1587 (#1588)

* Try-with-resource clean-up in JDT core

Using the JDT UI try-with-resource clean-up on core.
Also manually inlining the declaration of multiple places into the try()
clause.

* Make inner classes static where possible in JDT core

Running the JDT performnace clean-up "Make inner classes static where
possible" in JDT core

* Use Use lazy logical operator (&& and ||)

Running the performance clean-up "Use lazy logical operator (&& and ||)"
on JDT core

* Using Integer.toString directly in Disassembler

It is also a JDT UI performance clean-up but this clean-up found only
one occurrence.

* use Path.of() to avoid 'Potential resource leak' warnings

* @NonNullByDefault does not work for type arguments of a local type (#1694)

fixes #1693

* ClassCastException during code completion on Annotation (#1696)

fixes #1440

Also fixes noise from #1662

* CompilationUnitResolver: Name the CU that causes Exception (#1690)

for example during Cleanup
eclipse-jdt/eclipse.jdt.ui#950

Co-authored-by: Jörg Kubitz <jkubitz-eclipse@gmx.de>

* Code selection support for String template expressions (#1699)

Fixes  #1685

* Report error if string template is used without preview option enabled (#1697)

Improves the fix for #544

* ECJ crashes when an embedded expression contains broken code (#1702)

Set haltOnSyntaxError when parsing for embedded expressions. Also using the correct delimiters for text blocks in printExpression() methods.

* Selection model tests for string templates (#1704)

* tests: enable discouragedReference=warning, declare x-friends

to get rid of warnings during build (does not respect the jdt
preferences)

* Javadoc format fixes

Contributes to
eclipse-platform/eclipse.platform.releng.aggregator#1531

* Performance: Add public API for Batch Reads in UI - closes #1614

During Batches:
* cache Zip Files
* enable JavaModelManager.temporaryCache

Also:
* uses Batch Reads during some core actions that benefit from it.
* adds trace logging when caching is missing.

#1614

* Javadoc format fixes (part 2)

Contributes to
eclipse-platform/eclipse.platform.releng.aggregator#1531.
It's a pity that this takes multiple cycles but fixing one thing from
the log uncovers the next.

* ECJ 3.36.0 regression: The type 'E extends java.lang.Exception' is not a valid substitute for the type parameter 'E extends java.lang.@nonnull Exception' (#1708)

fixes #1691

+ also slightly updates NullAnnotationTests18 as NullAnnotationTests21

* Implement support for code completion inside embedded expression of (only) string templates (not text block templates) (#1712)

* Implement support for code completion inside embedded expression of
(only) string templates (not text block templates)

* Fixes #1711

* Fixes #1641 (#1713)

* Add new testcase #1701 (#1705)

* Content assist does not propose overrides in records (#1718)

* Fixes #1095

* JavaModelManager: lazy initialize TouchJob #1720

#1720

* Run the JavaCoreStandaloneTest in the build

#1720

* Bogus error about return expression involving pattern matching (#1731)

Fixes #1726

* Compiler fails to recognize an exhaustive switch (#1733)

*  Fixes #1725

* [21] Processed string templates falsely contain backslash characters (#1730)

#1719

* 1641_enum_further_fixes (#1739)

* Fix one too many pops arising from string concat invoke dynamic (#1740)

* Fix one too many pops arising from string concat invoke dynamic

* Fixes #1394

* Wrong placement of exception range closure results in AIOOB (#1744)

Fixes #1686

* Improper warning - Potential null pointer access (#1469)

Fixes #1461
Sets the flow info reach mode to FlowInfo.UNREACHABLE_BY_NULLANALYSIS
after 'Object o = null;if (Objects.isNull(o)) return;', 'Object o = "";if (Objects.nonNull(o)) return;

Signed-off-by: Snjezana Peco <snjezana.peco@redhat.com>

* Touch bundles affected by the changed ecj version

See #1394
See eclipse-platform/eclipse.platform.releng.aggregator#1659

* Upload eventfile and unit test results

* 2023-06->2023-09 Seems to have broke dependency graph management in our project (#1698)

* Add test for reproducing #1654
* Fix to make that test pass

---------

Co-authored-by: Stephan Herrmann <stephan.herrmann@berlin.de>

* [memory] SoftReference for ResourceCompilationUnit.contents #1743

Ability to reduce memory during searches that find many files

#1743

* deduplicate "eclipse" #1743

CharDeduplication was not designed to deduplicate tokens with length 7+
which could lead to high memory consumption. With this change tokens of
all sizes can be deduplicated.

#1743

A benchmark implemented in CharDeduplicationTest.main(String[]) shows
the new deduplication is performed at similar speed (.21s instead of
.16s) but deduplicates much more tokens (99% instead of 36%).

* 1703.constant definitions (#1756)

* Fixes [21] AIOOB at switchStatement TNode.addPattern  (#1757)

org.eclipse.jdt.internal.compiler.ast.SwitchStatement $TNode.addPattern

---------

Signed-off-by: Snjezana Peco <snjezana.peco@redhat.com>
Co-authored-by: Jörg Kubitz <jkubitz-eclipse@gmx.de>
Co-authored-by: Eric Milles <eric.milles@thomsonreuters.com>
Co-authored-by: Александър Куртаков <akurtakov@gmail.com>
Co-authored-by: Jay Arthanareeswaran <jarthana@in.ibm.com>
Co-authored-by: Stephan Herrmann <stephan.herrmann@berlin.de>
Co-authored-by: Lars Vogel <Lars.Vogel@vogella.com>
Co-authored-by: Suby S Surendran <suby.surendran@ibm.com>
Co-authored-by: Hannes Wellmann <wellmann.hannes1@gmx.net>
Co-authored-by: Andrey Loskutov <loskutov@gmx.de>
Co-authored-by: Gayan Perera <gayanper@gmail.com>
Co-authored-by: Jörg Kubitz <51790620+jukzi@users.noreply.github.com>
Co-authored-by: Srikanth Sankaran <131454720+srikanth-sankaran@users.noreply.github.com>
Co-authored-by: Ed Merks <ed.merks@gmail.com>
Co-authored-by: Snjeza <snjezana.peco@redhat.com>
Co-authored-by: Christoph Läubrich <laeubi@laeubi-soft.de>
Co-authored-by: Michael Haubenwallner <michael.haubenwallner@ssi-schaefer.com>
rgrunber pushed a commit to eclipse-jdtls/eclipse-jdt-core-incubator that referenced this pull request Jan 9, 2024
Grammar, compiler AST, resolution and code generation changes
rgrunber pushed a commit to eclipse-jdtls/eclipse-jdt-core-incubator that referenced this pull request Jan 9, 2024
The change in bytecode of FullSourceWorkspaceBuildTests is due the
constant value change of
o.e.jdt.internal.compiler.parser.TerminalTokens.TokenNameEOF coming
from eclipse-jdt#1513.

Fixes eclipse-platform/eclipse.platform.releng.aggregator#1617
@stephan-herrmann
Copy link
Contributor

NullAnnotationTest

I have added a kludge in CUScope, line number 772: this.environment.globalOptions.isAnnotationBasedNullAnalysisEnabled = false;

If you comment out this code and run the NullAnnotationTest, you will see some tests failing.

@jarthana as this now hits in #2178 I took a brief look and see the failures in NullAnnotationTest at 21+ when the kludge is removed. Just the other day we launched #2209, because the order of compilation steps is still brittle after quite some efforts in this field. By resolving a field right during the very first step CHECK_AND_SET_IMPORTS, we are certainly not in a position to safely resolve things like annotations, but class StringTemplate is annotated. So that approach is asking for trouble indeed.

Since we don't even know if this implicit import StringTemplate#STR will survive beyond the current round of preview, I wonder how much we should invest her. Would it be fair to put the magic import under the preview flag for now?

If that's not good, my next idea would be to encapsulate all fields of ImportBinding, so that we can use lazy initialization, but that would affect all locations accessing this class, so not a tiny change.

Third option: add the magic import much later. This might be OK because we'll never need a resolved field for resolving supertypes :) -- when resolving annotations we could in theory need to see the field from smth like @Process(tmpl=STR) but that will hardly be a realistic case ... so perhaps we could find a safe point in time to set the import after the LookupEnvironment has been bootstrapped with core types and annotations (incl. meta annotations).

Speaking of it: @srikanth-sankaran , do you think an explicit phase for resolving some primordial things like @Target, @Retention, Object, Enum, String, StringTemplate in a well defined order could help?

@stephan-herrmann
Copy link
Contributor

If that's not good, my next idea would be to encapsulate all fields of ImportBinding, so that we can use lazy initialization, but that would affect all locations accessing this class, so not a tiny change.

That's what I did in #2226. This makes resolving of StringTemplate.STR behave more like normal fields.

@srikanth-sankaran
Copy link
Contributor

Since we don't even know if this implicit import StringTemplate#STR will survive beyond the current round of preview, I wonder how much we should invest her. Would it be fair to put the magic import under the preview flag for now?

Not unreasonable, but we may be postponing the problem.

Third option: add the magic import much later. This might be OK because we'll never need a resolved field for resolving supertypes :) -- when resolving annotations we could in theory need to see the field from smth like @Process(tmpl=STR) but that will hardly be a realistic case ... so perhaps we could find a safe point in time to set the import after the LookupEnvironment has been bootstrapped with core types and annotations (incl. meta annotations).

This sounds promising. We could defer it almost to the point where an error would otherwise surface.

Speaking of it: @srikanth-sankaran , do you think an explicit phase for resolving some primordial things like @Target, @Retention, Object, Enum, String, StringTemplate in a well defined order could help?

Perhaps, but needs deeper study.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[21] JEP 430 String Templates (First Preview)
4 participants