From d0eb7b399ba1510610da9a7f4d29b671950f1426 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Hannu=20Niemist=C3=B6?= Date: Thu, 24 Aug 2017 12:23:17 +0300 Subject: [PATCH] (refs #7448) Logging exceptions Change-Id: I74cf2f40102adeb1c86abce3ecb4c9641d0fa7e5 --- .../elaboration/java/LoggingModule.java | 68 +++++++++++++------ .../scl/compiler/tests/scl/Logger.scl | 6 +- 2 files changed, 53 insertions(+), 21 deletions(-) diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/java/LoggingModule.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/java/LoggingModule.java index 45596c570..c0e3be53c 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/java/LoggingModule.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/java/LoggingModule.java @@ -27,6 +27,8 @@ public class LoggingModule extends ConcreteModule { private static String[] LOGGING_METHODS = new String[] { "trace", "debug", "info", "warn", "error" }; + + public static final TCon Throwable = Types.con("Prelude", "Throwable"); public LoggingModule() { super("Logging"); @@ -39,29 +41,55 @@ public class LoggingModule extends ConcreteModule { // Common types Type loggingType = Types.functionE(Types.STRING, Types.PROC, Types.UNIT); + Type loggingTypeWithException = Types.functionE(new Type[] { Types.STRING, Throwable }, Types.PROC, Types.UNIT); // Add logging methods for(String methodName : LOGGING_METHODS) { - JavaMethod javaMethod = new JavaMethod(false, "org/slf4j/Logger", methodName, Types.PROC, Types.UNIT, Logger, Types.STRING); - SCLValue value = new SCLValue(Name.create(getName(), methodName)); - value.setType(loggingType); - value.setMacroRule(new MacroRule() { - @Override - public Expression apply(SimplificationContext context, Type[] typeParameters, EApply apply) { - ConcreteModule module = context.getCompilationContext().module; - String identifier; - if (module != null) - identifier = module.getName().replaceAll("/", "."); - else - identifier = CommandSession.class.getName(); - apply.set(new ELiteral(javaMethod), new Expression[] { - new EExternalConstant(LoggerFactory.getLogger(identifier), Logger), - apply.parameters[0] - }); - return apply; - } - }); - addValue(value); + { + JavaMethod javaMethod = new JavaMethod(false, "org/slf4j/Logger", methodName, Types.PROC, Types.UNIT, Logger, Types.STRING); + SCLValue value = new SCLValue(Name.create(getName(), methodName)); + value.setType(loggingType); + value.setMacroRule(new MacroRule() { + @Override + public Expression apply(SimplificationContext context, Type[] typeParameters, EApply apply) { + ConcreteModule module = context.getCompilationContext().module; + String identifier; + if (module != null) + identifier = module.getName().replaceAll("/", "."); + else + identifier = CommandSession.class.getName(); + apply.set(new ELiteral(javaMethod), new Expression[] { + new EExternalConstant(LoggerFactory.getLogger(identifier), Logger), + apply.parameters[0] + }); + return apply; + } + }); + addValue(value); + } + { + JavaMethod javaMethod = new JavaMethod(false, "org/slf4j/Logger", methodName, Types.PROC, Types.UNIT, Logger, Types.STRING, Throwable); + SCLValue value = new SCLValue(Name.create(getName(), methodName + "E")); + value.setType(loggingTypeWithException); + value.setMacroRule(new MacroRule() { + @Override + public Expression apply(SimplificationContext context, Type[] typeParameters, EApply apply) { + ConcreteModule module = context.getCompilationContext().module; + String identifier; + if (module != null) + identifier = module.getName().replaceAll("/", "."); + else + identifier = CommandSession.class.getName(); + apply.set(new ELiteral(javaMethod), new Expression[] { + new EExternalConstant(LoggerFactory.getLogger(identifier), Logger), + apply.parameters[0], + apply.parameters[1] + }); + return apply; + } + }); + addValue(value); + } } setParentClassLoader(LoggerFactory.class.getClassLoader()); diff --git a/tests/org.simantics.scl.compiler.tests/src/org/simantics/scl/compiler/tests/scl/Logger.scl b/tests/org.simantics.scl.compiler.tests/src/org/simantics/scl/compiler/tests/scl/Logger.scl index 84a5030ec..1a8737514 100644 --- a/tests/org.simantics.scl.compiler.tests/src/org/simantics/scl/compiler/tests/scl/Logger.scl +++ b/tests/org.simantics.scl.compiler.tests/src/org/simantics/scl/compiler/tests/scl/Logger.scl @@ -1,5 +1,9 @@ import "Logging" +import "Prelude" -main = info "Something happened." +main = () + where + info "Something happened." + print (read "XX" :: Double) `catch` (\(e :: Throwable) -> errorE "Something bad happened." e) -- () \ No newline at end of file -- 2.43.2