public SourceFiles(SourceFile sourceFile) { add(sourceFile); }
@Override public Element getNextChild(Element child) { return getNextSibling(sourceFiles, child); }
@Override public Element getPreviousChild(Element child) { return getPreviousSibling(sourceFiles, child); }
public void parseBridgeSupportFiles() throws FileNotFoundException { SourceFiles sfs = new SourceFiles(); try { for (File bsf : result.config.bridgeSupportFiles) { try { sfs.add(parseBridgeSupportFile(bsf)); } catch (Throwable e) { // TODO Auto-generated catch block e.printStackTrace(); } } } finally { if (result.config.bridgesupportOutFile != null) { if (result.config.verbose) { System.out.println("Writing bridgesupport definitions to " + result.config.bridgesupportOutFile.getAbsolutePath()); } PrintWriter pw = new PrintWriter(result.config.bridgesupportOutFile); pw.println(sfs); pw.close(); } for (SourceFile sf : sfs.getSourceFiles()) { sourceFiles.add(sf); } } }
static void flatten(Element element, List<Declaration> out) { if (element instanceof SourceFiles) { for (SourceFile f : ((SourceFiles) element).getSourceFiles()) { flatten(f, out); } } if (element instanceof DeclarationsHolder) { for (Declaration d : ((DeclarationsHolder) element).getDeclarations()) { flatten(d, out); } } else if (element instanceof Declaration) { out.add((Declaration) element); } } }
public SourceFiles parse(final JNAeratorConfig config, TypeConversion typeConverter, MacroUseCallback macrosDependenciesOut) throws IOException, LexerException { SourceFiles sourceFiles = new SourceFiles(); Future<SourceFile> fut = executor.submit(createParsingCallable(config, typeConverter, sourceContent, topLevelTypeDefs, true)); try { sourceFiles.add(fut.get(config.fullParsingTimeout, TimeUnit.MILLISECONDS)); return removeTypeDefsConflictingWithForcedTypeDefs(sourceFiles, topLevelTypeDefs); } catch (Throwable ex) { for (Slice slice : slices) { try { sourceFiles.add(executor.submit(createParsingCallable(config, typeConverter, slice.text, topLevelTypeDefs, false)).get(config.sliceParsingTimeout, TimeUnit.MILLISECONDS)); } catch (Throwable ex) { if (firstFailure) {
System.out.println("Writing raw parsed sources to '" + config.rawParsedSourcesOutFile + "'"); WriteText.writeText(sourceFiles.toString(), config.rawParsedSourcesOutFile); sourceFiles.accept(new ObjectiveCToJavaPreScanner(result)); sourceFiles.accept(new CToJavaPreScanner()); sourceFiles.accept(new MissingNamesChooser(result, config.runtime.renameFunctionSignatures())); sourceFiles.accept(new Scanner() { @Override protected void visitTypeRef(TypeRef tr) { sourceFiles.accept(new JavaDocCreator(result)); System.out.println("Writing normalized parsed sources to '" + config.normalizedParsedSourcesOutFile + "'"); WriteText.writeText(sourceFiles.toString(), config.normalizedParsedSourcesOutFile); sourceFiles.accept(result); result.rehabilitateWeakTypeDefs();
private SourceFiles removeTypeDefsConflictingWithForcedTypeDefs(SourceFiles sourceFiles, final Set<String> forcedTypeDefs) { sourceFiles.accept(new Scanner() { Set<String> seenOnce = new HashSet<String>(); @Override public void visitTypeDef(TypeDef typeDef) { super.visitTypeDef(typeDef); List<Declarator> declaratorsToRemove = null; for (Declarator d : typeDef.getDeclarators()) { String n = d.resolveName(); if (forcedTypeDefs.contains(n) && !seenOnce.add(n)) { if (declaratorsToRemove == null) { declaratorsToRemove = new ArrayList<Declarator>(); } declaratorsToRemove.add(d); } } if (declaratorsToRemove != null) { for (Declarator d : declaratorsToRemove) { d.replaceBy(null); } } } }); return sourceFiles; }
public static void main(String[] args) { try { JNAeratorConfig config = new JNAeratorConfig(); config.verbose = true; Result result = new Result(config, null, null); SourceFiles sourceFiles = new SourceFiles(); File file = new File("/System/Library/Frameworks/Foundation.framework/Resources/BridgeSupport/FoundationFull.bridgesupport"); new BridgeSupportParser(result, sourceFiles).parseBridgeSupportFile(file); } catch (Exception ex) { ex.printStackTrace(); } }
@Override public boolean replaceChild(Element child, Element by) { if (replaceChild(defines, Define.class, this, child, by)) { return true; } return replaceChild(sourceFiles, SourceFile.class, this, child, by); } }
public void parseBridgeSupportFiles() throws FileNotFoundException { SourceFiles sfs = new SourceFiles(); try { for (File bsf : result.config.bridgeSupportFiles) { try { sfs.add(parseBridgeSupportFile(bsf)); } catch (Throwable e) { // TODO Auto-generated catch block e.printStackTrace(); } } } finally { if (result.config.bridgesupportOutFile != null) { if (result.config.verbose) { System.out.println("Writing bridgesupport definitions to " + result.config.bridgesupportOutFile.getAbsolutePath()); } PrintWriter pw = new PrintWriter(result.config.bridgesupportOutFile); pw.println(sfs); pw.close(); } for (SourceFile sf : sfs.getSourceFiles()) { sourceFiles.add(sf); } } }
static void flatten(Element element, List<Declaration> out) { if (element instanceof SourceFiles) { for (SourceFile f : ((SourceFiles) element).getSourceFiles()) { flatten(f, out); } } if (element instanceof DeclarationsHolder) { for (Declaration d : ((DeclarationsHolder) element).getDeclarations()) { flatten(d, out); } } else if (element instanceof Declaration) { out.add((Declaration) element); } } }
public SourceFiles parse(final JNAeratorConfig config, TypeConversion typeConverter, MacroUseCallback macrosDependenciesOut) throws IOException, LexerException { SourceFiles sourceFiles = new SourceFiles(); Future<SourceFile> fut = executor.submit(createParsingCallable(config, typeConverter, sourceContent, topLevelTypeDefs, true)); try { sourceFiles.add(fut.get(config.fullParsingTimeout, TimeUnit.MILLISECONDS)); return removeTypeDefsConflictingWithForcedTypeDefs(sourceFiles, topLevelTypeDefs); } catch (Throwable ex) { for (Slice slice : slices) { try { sourceFiles.add(executor.submit(createParsingCallable(config, typeConverter, slice.text, topLevelTypeDefs, false)).get(config.sliceParsingTimeout, TimeUnit.MILLISECONDS)); } catch (Throwable ex) { if (firstFailure) {
System.out.println("Writing raw parsed sources to '" + config.rawParsedSourcesOutFile + "'"); WriteText.writeText(sourceFiles.toString(), config.rawParsedSourcesOutFile); sourceFiles.accept(new ObjectiveCToJavaPreScanner(result)); sourceFiles.accept(new CToJavaPreScanner()); sourceFiles.accept(new MissingNamesChooser(result, config.runtime.renameFunctionSignatures())); sourceFiles.accept(new Scanner() { @Override protected void visitTypeRef(TypeRef tr) { sourceFiles.accept(new JavaDocCreator(result)); System.out.println("Writing normalized parsed sources to '" + config.normalizedParsedSourcesOutFile + "'"); WriteText.writeText(sourceFiles.toString(), config.normalizedParsedSourcesOutFile); sourceFiles.accept(result); result.rehabilitateWeakTypeDefs();
private SourceFiles removeTypeDefsConflictingWithForcedTypeDefs(SourceFiles sourceFiles, final Set<String> forcedTypeDefs) { sourceFiles.accept(new Scanner() { Set<String> seenOnce = new HashSet<String>(); @Override public void visitTypeDef(TypeDef typeDef) { super.visitTypeDef(typeDef); List<Declarator> declaratorsToRemove = null; for (Declarator d : typeDef.getDeclarators()) { String n = d.resolveName(); if (forcedTypeDefs.contains(n) && !seenOnce.add(n)) { if (declaratorsToRemove == null) { declaratorsToRemove = new ArrayList<Declarator>(); } declaratorsToRemove.add(d); } } if (declaratorsToRemove != null) { for (Declarator d : declaratorsToRemove) { d.replaceBy(null); } } } }); return sourceFiles; }
public static void main(String[] args) { try { JNAeratorConfig config = new JNAeratorConfig(); config.verbose = true; Result result = new Result(config, null, null); SourceFiles sourceFiles = new SourceFiles(); File file = new File("/System/Library/Frameworks/Foundation.framework/Resources/BridgeSupport/FoundationFull.bridgesupport"); new BridgeSupportParser(result, sourceFiles).parseBridgeSupportFile(file); } catch (Exception ex) { ex.printStackTrace(); } }
@Override public boolean replaceChild(Element child, Element by) { if (replaceChild(defines, Define.class, this, child, by)) { return true; } return replaceChild(sourceFiles, SourceFile.class, this, child, by); } }
@Override public void sourcesParsed(SourceFiles sourceFiles) { List<SourceFile> files = sourceFiles.getSourceFiles(); assertTrue(pref + "Parsing failed completely", !files.isEmpty()); //assertTrue(pref + "Expected more than one source file", files.size() > 1); SourceFile lastFile = files.get(files.size() - 1); List<Declaration> declarations = lastFile.getDeclarations(); assertTrue(pref + "Only parsed " + declarations.size() + " declarations", declarations.size() > 1); Declaration d = declarations.get(declarations.size() - 1); assertTrue(pref + "Not a function: " + d + " (" + (d == null ? "?" : d.getClass().getName()) + ")", d instanceof Function); Function f = (Function)d; assertEquals(pref + "Didn't find " + testFunctionName, testFunctionName, f.getName() + ""); }
private boolean checkNoCycles(SourceFiles sourceFiles) { final LinkedHashMap<Integer, Throwable> ids = new LinkedHashMap<Integer, Throwable>(new Arg().getId()); sourceFiles.accept(new Scanner() { @Override protected void visitElement(Element d) { if (d != null && ids.put(d.getId(), new RuntimeException().fillInStackTrace()) != null) { Throwable previous = ids.get(d.getId()); throw new RuntimeException("Cycle : " + d, previous); } super.visitElement(d); } }); return true; } }
@Override public Element getNextChild(Element child) { return getNextSibling(sourceFiles, child); }