Форматирование кода Java с использованием сценария оболочки - PullRequest
6 голосов
/ 16 июля 2009

Я знаю, что это глупо, но я не могу преодолеть свое любопытство. Можно ли написать сценарий оболочки для форматирования части кода Java?

Например, если пользователь пишет в коде:

    public class Super{
    public static void main(String[] args){
    System.out.println("Hello world");
    int a=0;
    if(a==100)
    {
    System.out.println("Hello world");
    }
    else
    {
    System.out.println("Hello world with else");
    }
    }
}

Я хотел бы написать сценарий оболочки, который бы сделал такой код.

 public class Super
 {
  public static void main(String[] args)
  {
   System.out.println("Hello world");
   int a=0;
   if(a==100){
    System.out.println("Hello world");
   }
   else{
    System.out.println("Hello world with else");
   }
}

Если быть точным, мы должны изменить формат цветочных скобок. Если это структуры try / catch или control, мы должны заменить ее на ту же строку, а если это функция / метод / класс, то она должна появиться на следующей строке. У меня мало знаний о sed и awk, которые могут так легко выполнить эту задачу. Также я знаю, что это можно сделать с помощью eclipse.

Ответы [ 6 ]

5 голосов
/ 17 июля 2009

Ну, у меня было немного свободного времени, поэтому я решил снова пережить свои старые добрые времена в Linux:]

Прочитав немного о awk и sed, я решил, что может быть лучше использовать оба, так как проще добавить отступ в awk и разобрать строки в sed.

Вот ~ / sed_script, который форматирует исходный файл:

    # delete indentation
    s/^ \+//g

    # format lines with class
    s/^\(.\+class.\+\) *\({.*\)$/\1\n\2/g

    # format lines with methods
    s/^\(public\|private\)\( \+static\)\?\( \+void\)\? \+\(.\+(.*)\) *\({.*\)$/\1\2\3 \4\n\5/g

    # format lines with other structures
    /^\(if\|else\|for\|while\|case\|do\|try\)\([^{]*\)$/,+1 {   # get lines not containing '{'
                                                            # along with the next line
      /.*{.*/ d             # delete the next line with '{'
      s/\([^{]*\)/\1 {/g    # and add '{' to the first line
    }

А вот ~ / awk_script, который добавляет отступ:

    BEGIN { depth = 0 }
    /}/   { depth = depth - 1 }
          {
              getPrefix(depth)
              print prefix $0
          }
    /{/   { depth = depth + 1 }

          function getPrefix(depth) {
              prefix = ""
              for (i = 0; i < depth; i++) { prefix = prefix "    "}
              return prefix
          }

И вы используете их так:

    > sed -f ~/sed_script ~/file_to_format > ~/.tmp_sed
    > awk -f ~/awk_script ~/.tmp_sed

Это далеко не правильный инструмент форматирования, но я надеюсь, что он хорошо подойдет в качестве примера сценария для справки:] Удачи в изучении.

2 голосов
/ 16 июля 2009

Быстрая, некорректная попытка, но она работает на вашем примере ввода:

BEGIN {depth = 0;}
/{$/  {depth = depth + 1}
/^}/  {depth = depth - 1}
      {prefix = ""; for (i = 0; i < depth; i++) { prefix = prefix "  "} print prefix $0 ; }

Это скрипт awk: поместите его в файл и выполните

awk -f awk_script_file source_file

Очевидные недостатки:

  • Это не ловит бесцельные места, где вы хотели бы отступы, как

    if (foo)
      bar();
    
  • Это изменит глубину отступа, основанную на скобках в комментариях и строковых литералах

  • Он не обнаружит {фигурные скобки, сопровождаемые комментариями
1 голос
/ 16 июля 2009

Я думаю, что это можно сделать с помощью простого сценария 'sed'. Используйте 1 переменную (bCount), которая хранит количество '{' (открывающие скобки) - (минус) количество '}' (закрывающие скобки) Затем я просматриваю файл и вставляю «вкладки» в соответствии с фактическим количеством используемых скобок. Итак

public class Super{ //bCount=0
public static void main(String[] args){ //bCount=1
System.out.println("Hello world"); //bCount=2
int a=0; //bCount=2
....and so on

поэтому вставьте 0 вкладок в строке 0

1 вкладка в строке 1

2 вкладки в строке 3 и 4 и т. Д. ...

1 голос
/ 16 июля 2009

Это определенно возможно ... Я просто не понимаю, почему вы хотели бы тратить на это свое время? :] Для этого достаточно инструментов, и любая приличная IDE предоставляет способ переформатировать исходный код (включая Eclipse).

Например, чтобы отформатировать в Eclipse 3.4 (должно быть аналогично в других версиях), просто щелкните правой кнопкой мыши ваш проект или файл и выберите «Source> Format» в меню.

И если вам нужно изменить способ форматирования кода, просто перейдите в «Настройки»> «Java»> «Стиль кода»> «Форматтер» и измените шаблон. Насколько я знаю, это очень похоже на JDeveloper и NetBeans.

0 голосов
/ 25 января 2010

Рассмотрите возможность использования Jindent , который является «простым инструментом Java Indent Tool с использованием Emacs» Это бесплатный сценарий оболочки, который является частью проекта Ptolemy в Беркли.

0 голосов
/ 16 июля 2009

Взгляните на CLI для Jalopy . Jalopy - довольно мощный исходный форматер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...