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

Enhance compile time un-matched closing element #114

Open
benjamin-dreux opened this issue Oct 5, 2024 · 0 comments
Open

Enhance compile time un-matched closing element #114

benjamin-dreux opened this issue Oct 5, 2024 · 0 comments

Comments

@benjamin-dreux
Copy link

One thing that is especially anoying with html is unmatched closing elements.

In a general purpose language the compiler will help with it.

In this case, I don't get why java's s type system doesn't help
I'm not even sure that we can enhance html fow to give a better feedback faster

Here is the case

public static void template (Div<?> container) {
        container
            .div()
                .h2()
                    
                .__() //h2
                .div().attrClass("row")
                    .div().attrClass("col-md-12")
                        
                        .__() //img
                    .__() //div
                .__() //div
            .__();
    }

Notice the closing element for img tag, that is missing.
Here is the error message that is produced at run time, when the templated is compiled

2024-10-05T19:11:00.145-04:00 ERROR 13800 --- [ifsr] [  restartedMain] o.s.boot.SpringApplication               : Application run failed

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'personController' defined in file [/Users/benjamindreux/Dépot/ifsr/target/classes/org/uqam/ifsr/person/PersonController.class]: Failed to instantiate [org.uqam.ifsr.person.PersonController]: Constructor threw exception
	at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:318) ~[spring-beans-6.1.13.jar:6.1.13]
	at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:306) ~[spring-beans-6.1.13.jar:6.1.13]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1375) ~[spring-beans-6.1.13.jar:6.1.13]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1212) ~[spring-beans-6.1.13.jar:6.1.13]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:562) ~[spring-beans-6.1.13.jar:6.1.13]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522) ~[spring-beans-6.1.13.jar:6.1.13]
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337) ~[spring-beans-6.1.13.jar:6.1.13]
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-6.1.13.jar:6.1.13]
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335) ~[spring-beans-6.1.13.jar:6.1.13]
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) ~[spring-beans-6.1.13.jar:6.1.13]
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:975) ~[spring-beans-6.1.13.jar:6.1.13]
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:971) ~[spring-context-6.1.13.jar:6.1.13]
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:625) ~[spring-context-6.1.13.jar:6.1.13]
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.3.4.jar:3.3.4]
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) ~[spring-boot-3.3.4.jar:3.3.4]
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456) ~[spring-boot-3.3.4.jar:3.3.4]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:335) ~[spring-boot-3.3.4.jar:3.3.4]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1363) ~[spring-boot-3.3.4.jar:3.3.4]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1352) ~[spring-boot-3.3.4.jar:3.3.4]
	at org.uqam.ifsr.IfsrApplication.main(IfsrApplication.java:13) ~[classes/:na]
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na]
	at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na]
	at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:50) ~[spring-boot-devtools-3.3.4.jar:3.3.4]
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.uqam.ifsr.person.PersonController]: Constructor threw exception
	at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:221) ~[spring-beans-6.1.13.jar:6.1.13]
	at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:117) ~[spring-beans-6.1.13.jar:6.1.13]
	at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:315) ~[spring-beans-6.1.13.jar:6.1.13]
	... 22 common frames omitted
Caused by: java.lang.ArrayIndexOutOfBoundsException: Index -1 out of bounds for length 1000
	at htmlflow.visitor.Indentation.tabs(Indentation.java:72) ~[htmlflow-4.0.jar:na]
	at htmlflow.visitor.HtmlVisitor.newlineAndIndent(HtmlVisitor.java:125) ~[htmlflow-4.0.jar:na]
	at htmlflow.visitor.HtmlVisitor.visitParent(HtmlVisitor.java:161) ~[htmlflow-4.0.jar:na]
	at org.xmlet.htmlapifaster.ElementVisitor.visitParentHtml(ElementVisitor.java:421) ~[htmlApiFaster-1.0.12.jar:na]
	at org.xmlet.htmlapifaster.Html.__(Html.java:29) ~[htmlApiFaster-1.0.12.jar:na]
	at org.uqam.ifsr.baseTemplate.Layout.lambda$view$1(Layout.java:45) ~[classes/:na]
	at htmlflow.HtmlFlow.preprocessing(HtmlFlow.java:52) ~[htmlflow-4.0.jar:na]
	at htmlflow.HtmlFlow.view(HtmlFlow.java:101) ~[htmlflow-4.0.jar:na]
	at org.uqam.ifsr.baseTemplate.Layout.view(Layout.java:12) ~[classes/:na]
	at org.uqam.ifsr.person.PersonController.<init>(PersonController.java:15) ~[classes/:na]
	at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:62) ~[na:na]
	at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:502) ~[na:na]
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:486) ~[na:na]
	at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:208) ~[spring-beans-6.1.13.jar:6.1.13]
	... 24 common frames omitted

If this can't be identified at compile time, then the error message should be rewritted in order to give a better context on what is happening.

Something along the line of "This is generally due to miss match in closing elements"

Hope this helps

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

No branches or pull requests

1 participant