Mercurial > hg > truffle
diff graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/template/MessageContainer.java @ 11466:4830676526e3
Truffle-DSL: added infrastructure to assert for DSL error messages.
author | Christian Humer <christian.humer@gmail.com> |
---|---|
date | Thu, 29 Aug 2013 17:39:55 +0200 |
parents | 79041ab43660 |
children | 43eab069ca9b |
line wrap: on
line diff
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/template/MessageContainer.java Thu Aug 29 14:28:43 2013 +0200 +++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/template/MessageContainer.java Thu Aug 29 17:39:55 2013 +0200 @@ -51,13 +51,29 @@ public abstract Element getMessageElement(); - public final void emitMessages(TypeElement baseElement, Log log) { - emitMessagesImpl(baseElement, log, new HashSet<MessageContainer>()); + public final void emitMessages(ProcessorContext context, TypeElement baseElement, Log log) { + emitMessagesImpl(context, baseElement, log, new HashSet<MessageContainer>()); } - private void emitMessagesImpl(TypeElement baseElement, Log log, Set<MessageContainer> visitedSinks) { + private void emitMessagesImpl(ProcessorContext context, TypeElement baseElement, Log log, Set<MessageContainer> visitedSinks) { + TypeElement expectError = context.getTruffleTypes().getExpectError(); + if (expectError != null) { + Element element = getMessageElement(); + AnnotationMirror mirror = Utils.findAnnotationMirror(element.getAnnotationMirrors(), expectError); + if (mirror != null) { + List<String> values = Utils.getAnnotationValueList(String.class, mirror, "value"); + if (values == null) { + values = Collections.emptyList(); + } + List<Message> msgs = getMessages(); + if (values.size() != msgs.size()) { + log.message(Kind.ERROR, element, mirror, Utils.getAnnotationValue(mirror, "value"), String.format("Error count expected %s but was %s.", values.size(), msgs.size())); + } + } + } + for (Message message : getMessages()) { - emitDefault(baseElement, log, message); + emitDefault(context, baseElement, log, message); } for (MessageContainer sink : findChildContainers()) { @@ -66,18 +82,46 @@ } visitedSinks.add(sink); - sink.emitMessagesImpl(baseElement, log, visitedSinks); + sink.emitMessagesImpl(context, baseElement, log, visitedSinks); } } - private void emitDefault(TypeElement baseType, Log log, Message message) { + private void emitDefault(ProcessorContext context, TypeElement baseType, Log log, Message message) { + Kind kind = message.getKind(); + + Element messageElement = getMessageElement(); + AnnotationMirror messageAnnotation = getMessageAnnotation(); + AnnotationValue messageValue = getMessageAnnotationValue(); + if (message.getAnnotationValue() != null) { + messageValue = message.getAnnotationValue(); + } + + String text = message.getText(); + TypeElement rootEnclosing = Utils.findRootEnclosingType(getMessageElement()); - if (rootEnclosing != null && Utils.typeEquals(baseType.asType(), rootEnclosing.asType()) && this == message.getOriginalContainer()) { - log.message(message.getKind(), getMessageElement(), getMessageAnnotation(), getMessageAnnotationValue(), message.getText()); - } else { + if (rootEnclosing == null || !Utils.typeEquals(baseType.asType(), rootEnclosing.asType()) || this != message.getOriginalContainer()) { + // redirect message MessageContainer original = message.getOriginalContainer(); - log.message(message.getKind(), baseType, null, null, wrapText(original.getMessageElement(), original.getMessageAnnotation(), message.getText())); + messageElement = baseType; + messageAnnotation = null; + messageValue = null; + text = wrapText(original.getMessageElement(), original.getMessageAnnotation(), message.getText()); } + + TypeElement expectError = context.getTruffleTypes().getExpectError(); + if (expectError != null) { + AnnotationMirror mirror = Utils.findAnnotationMirror(messageElement.getAnnotationMirrors(), expectError); + if (mirror != null) { + List<String> expectedTexts = Utils.getAnnotationValueList(String.class, mirror, "value"); + if (!expectedTexts.contains(text)) { + log.message(kind, messageElement, mirror, Utils.getAnnotationValue(mirror, "value"), String.format("Message expected one of '%s' but was '%s'.", expectedTexts, text)); + } else { + return; + } + } + } + + log.message(kind, messageElement, messageAnnotation, messageValue, text); } private static String wrapText(Element element, AnnotationMirror mirror, String text) {