1. Java / Говнокод #14081

    +68

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    public static AstRoot parse (String code) {
            CompilerEnvirons env = new CompilerEnvirons();
            env.setRecoverFromErrors(true);
            env.setGenerateDebugInfo(true);
            env.setRecordingComments(true);
    
            // try to ignore errors - does not seem to work
            env.setIdeMode(true);
    
            IRFactory factory = new IRFactory(env);
            AstRoot root = factory.parse(code, null, 0);
    
            // work around rhino bug 800616 (not fixed in neither rhino nor closure)
    
            root.visit(new NodeVisitor() {
                @Override
                public boolean visit(AstNode node) {
                    if (node instanceof NumberLiteral) {
                        NumberLiteral num = (NumberLiteral)node;
                        int from = num.getAbsolutePosition();
                        int to = from + num.getLength() + 2;
                        if (to < code.length()) {
                            String hex = "0x" + num.toSource();
                            if (code.substring(from, to).equals(hex)) {
                                // reset node value and length
                                num.setValue(hex); num.setLength(hex.length());
                            }
                        }
                        return false;
                    }
                    return true;
                }
            });
    
            // work around rhino SwitchStatement.toSource() bug with empty switches
            // https://github.com/mozilla/rhino/blob/master/src/org/mozilla/javascript/ast/SwitchStatement.java#L96
            // https://github.com/mozilla/rhino/blob/master/src/org/mozilla/javascript/ast/SwitchStatement.java#L107-L109
            // https://github.com/mozilla/rhino/blob/master/src/org/mozilla/javascript/ast/SwitchStatement.java#L158
            root.visit(new NodeVisitor() {
                @Override
                public boolean visit(AstNode node) {
                    if (node instanceof SwitchStatement) {
                        SwitchStatement ss = (SwitchStatement)node;
                        if (ss.getCases().isEmpty()) {
                            // need to add at least one node to make ss.cases non-null
                            ArrayList<SwitchCase> cases = new ArrayList<>();
                            cases.add(new SwitchCase());
                            ss.setCases(cases);
                            // set this back to empty list
                            cases.clear();
                            ss.setCases(cases);
                        }
                        return false;
                    }
                    return true;
                }
            });
    
            return root;
        }

    И ещё немножко трудовыебуднев пользователей рино: правда клёво взять и распарсить джаваскрипт одним простым методом? Авотхуй.

    Запостил: makc3d, 07 Ноября 2013

    Комментарии (2) RSS

    • а дайте пример жаваскрипта с switch case
      Ответить
      • switch (whatever) {}

        такое генерит тайпскрипт, приходится хавать
        Ответить

    Добавить комментарий