Example usage for com.google.gwt.eclipse.core.validators.java JsniParser extractMethodBody

List of usage examples for com.google.gwt.eclipse.core.validators.java JsniParser extractMethodBody

Introduction

In this page you can find the example usage for com.google.gwt.eclipse.core.validators.java JsniParser extractMethodBody.

Prototype

public static String extractMethodBody(String jsniMethod) 

Source Link

Usage

From source file:krasa.formatter.JsniFormattingUtil.java

License:Open Source License

public TextEdit format(IDocument document, TypedPosition partition, Map<String, String> javaFormattingPrefs,
        Map<String, String> javaScriptFormattingPrefs, String original) {
    try {//from  w  ww .ja  va2  s  .c om
        // Extract the JSNI block out of the document
        int offset = partition.getOffset();
        int length = partition.getLength();

        // Determine the line delimiter, indent string, and tab/indent widths
        String lineDelimiter = Settings.LINE_SEPARATOR;
        int tabWidth = IndentManipulation.getTabWidth(javaFormattingPrefs);
        int indentWidth = IndentManipulation.getIndentWidth(javaFormattingPrefs);

        // Get indentation level of the first line of the JSNI block (this should
        // be the line containing the JSNI method declaration)
        int methodDeclarationOffset = getMethodDeclarationOffset(document, offset);

        int jsniLine1 = document.getLineOfOffset(methodDeclarationOffset);
        int methodIndentLevel = getLineIndentLevel(document, jsniLine1, tabWidth, indentWidth);
        DefaultCodeFormatter defaultCodeFormatter = new DefaultCodeFormatter(javaFormattingPrefs);
        String indentLine = defaultCodeFormatter.createIndentationString(methodIndentLevel);

        // Extract the JSNI body out of the block and split it up by line
        String jsniSource = document.get(offset, length);
        String body = JsniParser.extractMethodBody(jsniSource);

        String formattedJs;

        // JSNI Java references mess up the JS formatter, so replace them
        // with place holder values
        JsniJavaRefReplacementResult replacementResults = replaceJsniJavaRefs(body);
        body = replacementResults.getJsni();
        CodeFormatter codeFormatter = JSCodeFormatterFacade.createCodeFormatter(javaScriptFormattingPrefs);

        TextEdit formatEdit = codeFormatter.format(CodeFormatter.K_STATEMENTS, body, 0, body.length(),
                methodIndentLevel + 1, lineDelimiter);

        if (formatEdit != null) {

            body = restoreJsniJavaRefs(replacementResults);

            Document d = new Document(body);
            formatEdit.apply(d);

            formattedJs = d.get();

            if (!formattedJs.startsWith(lineDelimiter)) {
                formattedJs = lineDelimiter + formattedJs;
            }

            if (!formattedJs.endsWith(lineDelimiter)) {
                formattedJs = formattedJs + lineDelimiter;
            }

            formattedJs = formattedJs + indentLine;

            formattedJs = "/*-{" + formattedJs + "}-*/";

        } else {

            if (original == null) {
                return null;
            }

            formattedJs = original; // formatting failed, use the original string
        }

        return new ReplaceEdit(offset, length, formattedJs);

    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}