You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jaxme-dev@ws.apache.org by "Andreas Neumann (JIRA)" <ja...@ws.apache.org> on 2006/12/04 13:20:21 UTC

[jira] Created: (JAXME-89) Multiple "implements" clauses are not supported

Multiple "implements" clauses are not supported
-----------------------------------------------

                 Key: JAXME-89
                 URL: http://issues.apache.org/jira/browse/JAXME-89
             Project: JaxMe
          Issue Type: Bug
          Components: JaxMeJS
    Affects Versions: 0.5
         Environment: Win XP, J2SE 1.5_09
            Reporter: Andreas Neumann


If you want to parse a java source file which implements more than one interface, the parser recognizes them as a single interface. I.e.:

public class TestClass implements AnInterface {

works fine, but

public class TestClass implements AnInterface, ASecondInterface, AThirdInterface {

fails. If you call JavaSource.getImplements() on the second example, you'll get a String like "AnInterfaceASecondInterfaceAThirdInterface".

The problem is in the JavaParser.class in the method "parseImplementsOrExtends", where the implements clause is handled like the extends clause and expecting only one interface.

Replace the method with something like this to make it work:



    private void parseImplementsOrExtends(JavaSource pSource, AST pAST, int pType) {
        AST implementsAST = findChild(pAST, pType);
        if (implementsAST == null) {
        	throw new IllegalStateException("AST implements not found");
        }
        if (implementsAST.getFirstChild() != null) {
            if (pType == JavaRecognizer.IMPLEMENTS_CLAUSE) {
                for (AST child = implementsAST.getFirstChild();  child != null;  child = child.getNextSibling()) {
                    String ident = parseIdentifier(child);
                    JavaQName qName = getQName(ident);
            	    pSource.addImplements(qName);
                }
            } else {
                String ident = parseIdentifier(implementsAST);
                JavaQName qName = getQName(ident);
            	pSource.addExtends(qName);
            }
        }
    }


-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe, e-mail: jaxme-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: jaxme-dev-help@ws.apache.org


[jira] Resolved: (JAXME-89) Multiple "implements" clauses are not supported

Posted by "Jochen Wiedmann (JIRA)" <ja...@ws.apache.org>.
     [ http://issues.apache.org/jira/browse/JAXME-89?page=all ]

Jochen Wiedmann resolved JAXME-89.
----------------------------------

    Fix Version/s: 0.6
       Resolution: Fixed
         Assignee: Jochen Wiedmann

Applied to 0.5 branch and trunk.


> Multiple "implements" clauses are not supported
> -----------------------------------------------
>
>                 Key: JAXME-89
>                 URL: http://issues.apache.org/jira/browse/JAXME-89
>             Project: JaxMe
>          Issue Type: Bug
>          Components: JaxMeJS
>    Affects Versions: 0.5
>         Environment: Win XP, J2SE 1.5_09
>            Reporter: Andreas Neumann
>         Assigned To: Jochen Wiedmann
>             Fix For: 0.6
>
>
> If you want to parse a java source file which implements more than one interface, the parser recognizes them as a single interface. I.e.:
> public class TestClass implements AnInterface {
> works fine, but
> public class TestClass implements AnInterface, ASecondInterface, AThirdInterface {
> fails. If you call JavaSource.getImplements() on the second example, you'll get a String like "AnInterfaceASecondInterfaceAThirdInterface".
> The problem is in the JavaParser.class in the method "parseImplementsOrExtends", where the implements clause is handled like the extends clause and expecting only one interface.
> Replace the method with something like this to make it work:
>     private void parseImplementsOrExtends(JavaSource pSource, AST pAST, int pType) {
>         AST implementsAST = findChild(pAST, pType);
>         if (implementsAST == null) {
>         	throw new IllegalStateException("AST implements not found");
>         }
>         if (implementsAST.getFirstChild() != null) {
>             if (pType == JavaRecognizer.IMPLEMENTS_CLAUSE) {
>                 for (AST child = implementsAST.getFirstChild();  child != null;  child = child.getNextSibling()) {
>                     String ident = parseIdentifier(child);
>                     JavaQName qName = getQName(ident);
>             	    pSource.addImplements(qName);
>                 }
>             } else {
>                 String ident = parseIdentifier(implementsAST);
>                 JavaQName qName = getQName(ident);
>             	pSource.addExtends(qName);
>             }
>         }
>     }

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe, e-mail: jaxme-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: jaxme-dev-help@ws.apache.org


[jira] Commented: (JAXME-89) Multiple "implements" clauses are not supported

Posted by "Andreas Neumann (JIRA)" <ja...@ws.apache.org>.
    [ http://issues.apache.org/jira/browse/JAXME-89?page=comments#action_12455309 ] 
            
Andreas Neumann commented on JAXME-89:
--------------------------------------

Ok, the first one was kind of a quickshot, the problem is that I've used parseIdentifier and not parseSimpleIdentifier. And as parseIdentifier tries to iterate over the child nodes again, it fails.

Here's a new try. This should handle also the extends clause for interfaces as well.

    private void parseImplementsOrExtends(JavaSource pSource, AST pAST, int pType) {
        AST implementsAST = findChild(pAST, pType);
        if (implementsAST == null) {
        	throw new IllegalStateException("AST implements not found");
        }
        if (implementsAST.getFirstChild() != null) {
            for (AST child = implementsAST.getFirstChild();  child != null;  child = child.getNextSibling()) {
                String ident = parseSimpleIdentifier(child);
                JavaQName qName = getQName(ident);
            	if (pType == JavaRecognizer.IMPLEMENTS_CLAUSE) {
            	    pSource.addImplements(qName);
                } else {
            	    pSource.addExtends(qName);
                }
	    }
        }
    }

> Multiple "implements" clauses are not supported
> -----------------------------------------------
>
>                 Key: JAXME-89
>                 URL: http://issues.apache.org/jira/browse/JAXME-89
>             Project: JaxMe
>          Issue Type: Bug
>          Components: JaxMeJS
>    Affects Versions: 0.5
>         Environment: Win XP, J2SE 1.5_09
>            Reporter: Andreas Neumann
>
> If you want to parse a java source file which implements more than one interface, the parser recognizes them as a single interface. I.e.:
> public class TestClass implements AnInterface {
> works fine, but
> public class TestClass implements AnInterface, ASecondInterface, AThirdInterface {
> fails. If you call JavaSource.getImplements() on the second example, you'll get a String like "AnInterfaceASecondInterfaceAThirdInterface".
> The problem is in the JavaParser.class in the method "parseImplementsOrExtends", where the implements clause is handled like the extends clause and expecting only one interface.
> Replace the method with something like this to make it work:
>     private void parseImplementsOrExtends(JavaSource pSource, AST pAST, int pType) {
>         AST implementsAST = findChild(pAST, pType);
>         if (implementsAST == null) {
>         	throw new IllegalStateException("AST implements not found");
>         }
>         if (implementsAST.getFirstChild() != null) {
>             if (pType == JavaRecognizer.IMPLEMENTS_CLAUSE) {
>                 for (AST child = implementsAST.getFirstChild();  child != null;  child = child.getNextSibling()) {
>                     String ident = parseIdentifier(child);
>                     JavaQName qName = getQName(ident);
>             	    pSource.addImplements(qName);
>                 }
>             } else {
>                 String ident = parseIdentifier(implementsAST);
>                 JavaQName qName = getQName(ident);
>             	pSource.addExtends(qName);
>             }
>         }
>     }

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe, e-mail: jaxme-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: jaxme-dev-help@ws.apache.org


[jira] Commented: (JAXME-89) Multiple "implements" clauses are not supported

Posted by "Jochen Wiedmann (JIRA)" <ja...@ws.apache.org>.
    [ http://issues.apache.org/jira/browse/JAXME-89?page=comments#action_12455301 ] 
            
Jochen Wiedmann commented on JAXME-89:
--------------------------------------

I haven't yet worked out why, but the AntLRTest fails after applying your patch:

The class name must not be null or empty.
java.lang.NullPointerException: The class name must not be null or empty.
	at org.apache.ws.jaxme.js.JavaQNameImpl.getInstance(JavaQNameImpl.java:231)
	at org.apache.ws.jaxme.js.util.JavaParser.getQName(JavaParser.java:334)
	at org.apache.ws.jaxme.js.util.JavaParser.parseImplementsOrExtends(JavaParser.java:348)
	at org.apache.ws.jaxme.js.util.JavaParser.parseClassDefinition(JavaParser.java:492)
	at org.apache.ws.jaxme.js.util.JavaParser.parseAST(JavaParser.java:509)
	at org.apache.ws.jaxme.js.util.JavaParser.parse(JavaParser.java:112)
	at org.apache.ws.jaxme.js.util.JavaParser.parse(JavaParser.java:82)
	at org.apache.ws.jaxme.js.util.JavaParser.parse(JavaParser.java:74)
	at org.apache.ws.jaxme.js.util.JavaParser.main(JavaParser.java:521)
	at org.apache.ws.jaxme.js.junit.AntlrTest.test(AntlrTest.java:40)
	at org.eclipse.ant.internal.ui.antsupport.EclipseDefaultExecutor.executeTargets(EclipseDefaultExecutor.java:32)
	at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.run(InternalAntRunner.java:423)
	at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.main(InternalAntRunner.java:137)


Also, could you please consider handling the case  "extends I1, I2, ..." as well, because that is valid for interfaces?


> Multiple "implements" clauses are not supported
> -----------------------------------------------
>
>                 Key: JAXME-89
>                 URL: http://issues.apache.org/jira/browse/JAXME-89
>             Project: JaxMe
>          Issue Type: Bug
>          Components: JaxMeJS
>    Affects Versions: 0.5
>         Environment: Win XP, J2SE 1.5_09
>            Reporter: Andreas Neumann
>
> If you want to parse a java source file which implements more than one interface, the parser recognizes them as a single interface. I.e.:
> public class TestClass implements AnInterface {
> works fine, but
> public class TestClass implements AnInterface, ASecondInterface, AThirdInterface {
> fails. If you call JavaSource.getImplements() on the second example, you'll get a String like "AnInterfaceASecondInterfaceAThirdInterface".
> The problem is in the JavaParser.class in the method "parseImplementsOrExtends", where the implements clause is handled like the extends clause and expecting only one interface.
> Replace the method with something like this to make it work:
>     private void parseImplementsOrExtends(JavaSource pSource, AST pAST, int pType) {
>         AST implementsAST = findChild(pAST, pType);
>         if (implementsAST == null) {
>         	throw new IllegalStateException("AST implements not found");
>         }
>         if (implementsAST.getFirstChild() != null) {
>             if (pType == JavaRecognizer.IMPLEMENTS_CLAUSE) {
>                 for (AST child = implementsAST.getFirstChild();  child != null;  child = child.getNextSibling()) {
>                     String ident = parseIdentifier(child);
>                     JavaQName qName = getQName(ident);
>             	    pSource.addImplements(qName);
>                 }
>             } else {
>                 String ident = parseIdentifier(implementsAST);
>                 JavaQName qName = getQName(ident);
>             	pSource.addExtends(qName);
>             }
>         }
>     }

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe, e-mail: jaxme-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: jaxme-dev-help@ws.apache.org