# HG changeset patch # User Christian Humer # Date 1375275853 -7200 # Node ID ae6b8ec920e2508a117accd04dbb2cdb275d6dac # Parent 7a8835ec5e7d6ef7144cfe0af6024aecd19405a2 Truffle-DSL: Added a hack to get around eclipse bug 300408. (https://bugs.eclipse.org/bugs/show_bug.cgi?id=300408) diff -r 7a8835ec5e7d -r ae6b8ec920e2 graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/compiler/Compiler.java --- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/compiler/Compiler.java Tue Jul 30 17:42:50 2013 +0200 +++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/compiler/Compiler.java Wed Jul 31 15:04:13 2013 +0200 @@ -22,6 +22,8 @@ */ package com.oracle.truffle.dsl.processor.compiler; +import java.util.*; + import javax.annotation.processing.*; import javax.lang.model.element.*; @@ -31,4 +33,6 @@ String getHeaderComment(ProcessingEnvironment env, Element type); + List getEnclosedElementsDeclarationOrder(TypeElement type); + } diff -r 7a8835ec5e7d -r ae6b8ec920e2 graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/compiler/JDTCompiler.java --- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/compiler/JDTCompiler.java Tue Jul 30 17:42:50 2013 +0200 +++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/compiler/JDTCompiler.java Wed Jul 31 15:04:13 2013 +0200 @@ -22,6 +22,8 @@ */ package com.oracle.truffle.dsl.processor.compiler; +import java.util.*; + import javax.annotation.processing.*; import javax.lang.model.element.*; @@ -38,6 +40,65 @@ } } + public List getEnclosedElementsDeclarationOrder(TypeElement type) { + try { + Object binding = field(type, "_binding"); + + Class sourceTypeBinding = Class.forName("org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding"); + + final List declarationOrder; + if (sourceTypeBinding.isAssignableFrom(binding.getClass())) { + declarationOrder = findSourceOrder(binding); + } else { + return null; + } + + List enclosedElements = new ArrayList<>(type.getEnclosedElements()); + Collections.sort(enclosedElements, new Comparator() { + + public int compare(Element o1, Element o2) { + try { + Object o1Binding = field(o1, "_binding"); + Object o2Binding = field(o2, "_binding"); + + int i1 = declarationOrder.indexOf(o1Binding); + int i2 = declarationOrder.indexOf(o2Binding); + + return i1 - i2; + } catch (Exception e) { + return 0; + } + } + + }); + return enclosedElements; + } catch (Exception e) { + return null; + } + } + + private static List findSourceOrder(Object binding) throws Exception { + Object referenceContext = field(field(binding, "scope"), "referenceContext"); + + TreeMap orderedBindings = new TreeMap<>(); + + collectSourceOrder(orderedBindings, referenceContext, "methods"); + collectSourceOrder(orderedBindings, referenceContext, "fields"); + collectSourceOrder(orderedBindings, referenceContext, "memberTypes"); + + return new ArrayList<>(orderedBindings.values()); + } + + private static void collectSourceOrder(TreeMap orderedBindings, Object referenceContext, String fieldName) throws Exception { + Object[] declarations = (Object[]) field(referenceContext, fieldName); + if (declarations != null) { + for (int i = 0; i < declarations.length; i++) { + Integer declarationSourceStart = (Integer) field(declarations[i], "declarationSourceStart"); + orderedBindings.put(declarationSourceStart, field(declarations[i], "binding")); + } + } + } + @Override public String getMethodBody(ProcessingEnvironment env, ExecutableElement method) { try { diff -r 7a8835ec5e7d -r ae6b8ec920e2 graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/compiler/JavaCCompiler.java --- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/compiler/JavaCCompiler.java Tue Jul 30 17:42:50 2013 +0200 +++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/compiler/JavaCCompiler.java Wed Jul 31 15:04:13 2013 +0200 @@ -22,6 +22,8 @@ */ package com.oracle.truffle.dsl.processor.compiler; +import java.util.*; + import javax.annotation.processing.*; import javax.lang.model.element.*; @@ -38,6 +40,10 @@ } } + public List getEnclosedElementsDeclarationOrder(TypeElement type) { + return type.getEnclosedElements(); + } + private static final Class[] getTreeAndTopLevelSignature = new Class[]{Element.class, AnnotationMirror.class, AnnotationValue.class}; private static final Class[] getCharContentSignature = new Class[]{boolean.class};