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

Generated XML does not distinguish "new HashSet()" from "new HashSet<>()" #2751

Closed
michaelhkay opened this issue Jul 6, 2020 · 2 comments · Fixed by #4183
Closed

Generated XML does not distinguish "new HashSet()" from "new HashSet<>()" #2751

michaelhkay opened this issue Jul 6, 2020 · 2 comments · Fixed by #4183

Comments

@michaelhkay
Copy link

The XML serializer does not distinguish an empty NodeList property from a null NodeList property.

In consequence "new HashSet()" and "new HashSet<>()" produce the same output: in one case type.typeArguments is null, in the other case it is empty.

@michaelhkay
Copy link
Author

I've changed XmlPrinter so it now outputs an empty NodeList property as an empty element: with new HashSet<>(40) we now get

                     <initializer nodeType="ObjectCreationExpr">
                        <type nodeType="ClassOrInterfaceType">
                           <name nodeType="SimpleName" identifier="HashSet"/>
                           <typeArguments/>
                           <annotations/>
                        </type>
                        <arguments>
                           <argument nodeType="IntegerLiteralExpr" value="40"/>
                        </arguments>
                     </initializer>

(Note the empty <typeArguments/> element). This gives me the information needed to distinguish these two cases. I realise that doing this for all empty NodeLists could (a) inflate the XML size, and (b) cause backwards compatibility issues for existing users, but it works for me.

@michaelhkay
Copy link
Author

Making this change for all properties of all nodes does turn out to be rather disruptive. So perhaps the change needs to be confined to cases where there is actually a semantic difference between a null property and an empty property? Unfortunately it's not easy to enumerate those cases.

lcbarcellos added a commit to lcbarcellos/javaparser that referenced this issue Oct 29, 2023
Change XML generator so that an empty type argument list is
emmitted as an empty XML element. All other empty lists
keep not being emmitted.
jlerbsc added a commit that referenced this issue Oct 29, 2023
Fix: issue #2751 new HashSet()" != "new HashSet<>()
wadoon added a commit to jmltoolkit/jmlparser that referenced this issue Nov 19, 2023
# By jlerbsc (56) and others
# Via GitHub (67) and others
* tag 'javaparser-parent-3.25.6': (136 commits)
  [maven-release-plugin] prepare release javaparser-parent-3.25.6
  update readme
  Update changelog
  Fix: issue javaparser#2751 new HashSet()" != "new HashSet<>()
  Added messages to LambdaExprContext
  Added messages to LambdaExprContext and TypeExtractor
  chore(deps): update dependency org.apache.maven.plugins:maven-clean-plugin to v3.3.2
  Modified exception message thrown for unknown change type
  Changes unknown to not supported
  Modified and added message to UnsupportedOperationException() in ConcreteSyntaxModel, Difference and NodeText class
  Modified and added message to UnsupportedOperationException() in Added.java
  Modified and added message to UnsupportedOperationException() in LexicalDifferenceCalculator
  Modified and added message to UnsupportedOperationException()
  chore(deps): update dependency org.apache.maven.plugins:maven-checkstyle-plugin to v3.3.1
  chore(deps): update dependency org.apache.maven.plugins:maven-dependency-plugin to v3.6.1
  chore(deps): update dependency org.apache.maven.plugins:maven-surefire-plugin to v3.2.1
  Java 8 compatibility fix.
  Test custom XML
  Test streaming to file
  Test cleanup and temp file support
  ...

# Conflicts:
#	.github/workflows/maven_tests.yml
#	changelog.md
#	javaparser-core-generators/pom.xml
#	javaparser-core-generators/src/main/java/com/github/javaparser/generator/core/utils/CodeUtils.java
#	javaparser-core-metamodel-generator/pom.xml
#	javaparser-core-serialization/pom.xml
#	javaparser-core-testing-bdd/pom.xml
#	javaparser-core-testing/pom.xml
#	javaparser-core-testing/src/test/java/com/github/javaparser/ast/ParseResultTest.java
#	javaparser-core-testing/src/test/java/com/github/javaparser/printer/lexicalpreservation/LexicalPreservingPrinterTest.java
#	javaparser-core/pom.xml
#	javaparser-core/src/main/java/com/github/javaparser/UnicodeEscapeProcessingProvider.java
#	javaparser-core/src/main/java/com/github/javaparser/ast/body/CallableDeclaration.java
#	javaparser-core/src/main/java/com/github/javaparser/ast/body/CompactConstructorDeclaration.java
#	javaparser-core/src/main/java/com/github/javaparser/ast/body/ConstructorDeclaration.java
#	javaparser-core/src/main/java/com/github/javaparser/ast/body/FieldDeclaration.java
#	javaparser-core/src/main/java/com/github/javaparser/ast/body/MethodDeclaration.java
#	javaparser-core/src/main/java/com/github/javaparser/ast/type/VarType.java
#	javaparser-core/src/main/java/com/github/javaparser/ast/validator/ProblemReporter.java
#	javaparser-core/src/main/java/com/github/javaparser/ast/validator/language_level_validations/Java1_0Validator.java
#	javaparser-core/src/main/java/com/github/javaparser/printer/concretesyntaxmodel/CsmElement.java
#	javaparser-core/src/main/java/com/github/javaparser/printer/concretesyntaxmodel/CsmToken.java
#	javaparser-core/src/main/java/com/github/javaparser/printer/lexicalpreservation/ChildTextElement.java
#	javaparser-core/src/main/java/com/github/javaparser/printer/lexicalpreservation/Difference.java
#	javaparser-core/src/main/java/com/github/javaparser/printer/lexicalpreservation/LexicalDifferenceCalculator.java
#	javaparser-core/src/main/java/com/github/javaparser/printer/lexicalpreservation/LexicalPreservingPrinter.java
#	javaparser-core/src/main/java/com/github/javaparser/printer/lexicalpreservation/TokenTextElement.java
#	javaparser-core/src/main/java/com/github/javaparser/resolution/logic/ConstructorResolutionLogic.java
#	javaparser-core/src/main/java/com/github/javaparser/resolution/types/ResolvedIntersectionType.java
#	javaparser-core/src/main/java/com/github/javaparser/resolution/types/ResolvedUnionType.java
#	javaparser-core/src/main/javacc/java.jj
#	javaparser-symbol-solver-core/pom.xml
#	javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/JavaSymbolSolver.java
#	javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/JavaParserFacade.java
#	javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/JavaParserFactory.java
#	javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/TypeExtractor.java
#	javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/contexts/AbstractJavaParserContext.java
#	javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/contexts/ContextHelper.java
#	javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/contexts/LambdaExprContext.java
#	javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/contexts/MethodCallExprContext.java
#	javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/contexts/StatementContext.java
#	javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserTypeParameter.java
#	javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javassistmodel/JavassistAnnotationDeclaration.java
#	javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javassistmodel/JavassistFactory.java
#	javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/reflectionmodel/ReflectionAnnotationMemberDeclaration.java
#	javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/reflectionmodel/ReflectionEnumDeclaration.java
#	javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/reflectionmodel/ReflectionFactory.java
#	javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/resolution/promotion/NumericConditionalExprHandler.java
#	javaparser-symbol-solver-testing/pom.xml
#	javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/model/typesystem/ReferenceTypeTest.java
#	javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/CompilationUnitContextResolutionTest.java
#	javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/ImplementedOrExtendedTypeResolutionTest.java
#	javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/typeinference/LeastUpperBoundTest.java
#	pom.xml
#	readme.md
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 a pull request may close this issue.

1 participant