Как принудительно переименовать имена переменных в eclipse mars

Как я могу заставить eclipse mars переименовывать имена переменных? Когда я пытаюсь, я получаю

Этот рефакторинг невозможно выполнить корректно из-за синтаксических ошибок в модуле компиляции.

Диалог предлагает только "Отмена".

Это можно было сделать в более старых версиях eclipse, и я широко использовал эту функцию, например, после копирования и вставки фрагментов кода, найденных в сети.

Обратите внимание, что это не дубликат Рефакторинг имен переменных в Eclipse .

Редактировать 3 (резюме того, что произошло):

В коде (показанном ниже) были не только такие распространенные ошибки, как отсутствующий импорт или необъявленные переменные, но и отсутствующий ";", то есть настоящая синтаксическая ошибка. Это, сначала скрытое среди нескольких других проблем компиляции, заставило eclipse отказаться от рефакторинга.

Как оказалось, это особенность не марса, а более старых версий затмения.

Изменить: вот мой пример кода. В основном он основан на примерах из tutorialspoint для mongodb, но, скорее всего, не имеет ничего общего с mongo.

import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientURI;
import com.mongodb.MongoCredential;
import com.mongodb.client.MongoDatabase;

public class MongoDBJDBC2 {

  private static String myUserName;
  private static String myPassword;
  private static String myHost = "localhost";
  private static String myDatabaseName = "mydb";
  private static MongoDatabase db;

  public MongoDBJDBC2() {
    initDb();
    // TODO Auto-generated constructor stub
  }

  public static void main(String args[]) {
    MongoDBJDBC2 mo = new MongoDBJDBC2();
  }

  private static void initDb() {
    MongoClientURI uri = new MongoClientURI(
        "mongodb://" + myUserName + ":" + myPassword + "@" + myHost + "/?authSource=db1");
    try (MongoClient mongoClient = new MongoClient(uri);) {

      db = mongoClient.getDatabase(myDatabaseName);
      System.out.println("Connect to database successfully");
      //  boolean auth = db.authenticate(myUserName, myPassword);

    } catch (Exception e) {
      System.err.println(e.getClass().getName() + ": " + e.getMessage());
    }
  }

  public static void main4( String args[] ) {

    try{   

       // To connect to mongodb server
       MongoClient mongoClient = new MongoClient( "localhost" , 27017 );

       // Now connect to your databases
       DB db = mongoClient.getDB( "test" );
       System.out.println("Connect to database successfully");

       boolean auth = db.authenticate(myUserName, myPassword);
       System.out.println("Authentication: "+auth);   

       DBCollection coll = db.getCollection("mycol");
       System.out.println("Collection mycol selected successfully");

       DBCursor cursor = coll.find();

       while (cursor.hasNext()) { 
          DBObject updateDocument = cursor.next();
          updateDocument.put("likes","200")
          col1.update(updateDocument); 
       }

       System.out.println("Document updated successfully");
       cursor = coll.find();

       int i = 1;

       while (cursor.hasNext()) { 
          System.out.println("Updated Document: "+i); 
          System.out.println(cursor.next()); 
          i++;
       }

    }catch(Exception e){
       System.err.println( e.getClass().getName() + ": " + e.getMessage() );
    }
 }

}

Я пытаюсь переименовать db в myDb в

private static MongoDatabase db;

Раньше я использовал eclipse Helios и никогда не сталкивался с такой «функцией».

Edit2: я обнаружил фатальную ошибку. В методе "main4" отсутствует точка с запятой после

updateDocument.put("likes", "200")

До сих пор не понимаю, почему это так расстраивает eclipse, что он отказывается от рефакторинга, и мне все же хотелось бы знать, есть ли способ принудительно провести рефакторинг, несмотря на ошибки.


person Gyro Gearloose    schedule 22.11.2015    source источник
comment
Устраните ошибку компиляции и повторите попытку.   -  person Marcinek    schedule 22.11.2015
comment
Заменяемая переменная была статической. Когда я удалил статический модификатор и попробовал снова, то... рефакторинг не может... сводился к предупреждению, а рядом с кнопкой Отмена появилось Продолжить. Итак, я предполагаю, что есть два уровня ошибок, один из которых допускает продолжение, а другой фатальный.   -  person Gyro Gearloose    schedule 22.11.2015
comment
Можете ли вы подтвердить, в какой старой версии это было возможно, и, если возможно, минимально воспроизводимый пример, который работал в старой версии а не более новая версия. Если вы сможете собрать все это воедино, у вас будет идеальный отчет об ошибке для Eclipse, и вы сможете отправить его, чтобы сделать Eclipse лучше, по адресу bugs.eclipse.org/bugs   -  person Jonah Graham    schedule 22.11.2015
comment
@JonahGraham посмотрит и уменьшит мой пример, это займет некоторое время.   -  person Gyro Gearloose    schedule 22.11.2015
comment
@GyroGearloose Сообщество Eclipse было бы очень признательно, если бы вы отправили такой отчет об ошибке, это звучит как один из случаев, когда он мог регрессировать, и никто этого не заметил.   -  person Jonah Graham    schedule 22.11.2015
comment
PS Я попробовал несколько примеров в Кеплере и Марсе и получил одинаковое поведение в обоих. Для синтаксических ошибок у меня не было продолжения ни в том, ни в другом, для семантических ошибок у меня было продолжение в обоих.   -  person Jonah Graham    schedule 22.11.2015
comment
@JonahGraham Вы правы, с отсутствующей точкой с запятой даже у Гелиоса есть эта функция. Не могу вспомнить, когда у меня в последний раз была проблема с истинной синтаксической ошибкой, поэтому я возлагаю вину на Марса.   -  person Gyro Gearloose    schedule 22.11.2015


Ответы (2)


Компиляторы выдают два вида ошибок: синтаксические ошибки и все остальные виды ошибок, такие как «несоответствие типов» и «символ не найден». Eclipse жалуется на синтаксическую ошибку. Вы уверены, что в предыдущих случаях, когда Eclipse соглашалась на рефакторинг вашего кода, несмотря на то, что он содержал ошибки, это были синтаксические ошибки, которые содержались в вашем коде? Видите ли, есть большая разница.

Рефакторинг имен символов в java гораздо более сложен, чем простой текстовый поиск и замена, необходимо учитывать структуру вашего кода.

Но в случае синтаксической ошибки компилятор отказался от разбора вашего файла, поэтому он не знает структуру вашего кода: он не знает, какие токены являются переменными, какие токены являются типами, какие токены являются методами и т. д. поэтому он действительно не может выполнить рефакторинг, который вы хотите.

Итак, если вы действительно должны продолжить рефакторинг, несмотря на наличие синтаксических ошибок, то я боюсь, что текстовый поиск и замена — это то, что вам нужно в этом конкретном случае.

Но исправление синтаксических ошибок перед рефакторингом было бы наиболее благоразумным.

person Mike Nakis    schedule 22.11.2015
comment
Я думаю, что большая часть этого ответа хороша, но последний абзац немного экстремальный. Нередко вставляется фрагмент кода, который вызывает некоторые ошибки, а затем выполняется рефакторинг. На самом деле, Eclipse даже не предупреждает вас о переименовании при ошибке Duplicate local variable, но переименовываемые вхождения могут не соответствовать вашим намерениям. - person Jonah Graham; 22.11.2015
comment
@JonahGraham, ты прав. Я даже пользовался этим, именно при вставке кода. Я изменю последний абзац. - person Mike Nakis; 22.11.2015
comment
@MikeNakis Спасибо, что указали на влияние различных видов ошибок на затмение. Что мне кажется немного сумасшедшим, так это то, что eclipse не только отмечает ошибку, но и отмечает, что a ; отсутствует, но все еще смертельно обеспокоен. - person Gyro Gearloose; 22.11.2015
comment
Да, синтаксические ошибки имеют тенденцию делать это. Точки с запятой, в частности, являются очень деликатной темой, потому что синтаксические анализаторы в значительной степени полагаются на точки с запятой, чтобы разделить код на операторы, а затем попытаться понять смысл операторов. Таким образом, довольно часто о проблемах с синтаксисом оператора сообщается как о проблеме с точкой с запятой. И Java в этом отношении не так странен, как другие языки. Возьмем, к примеру, C++: довольно часто ошибки, выдаваемые компиляторами C++, не указывают на то место, где на самом деле допустил ошибку программист. - person Mike Nakis; 22.11.2015
comment
(‹small›Когда дело доходит до проверки синтаксической корректности, java — идеальная мечта, C/C++ — стандарт, а perl — настоящий ужас ‹/small›) - person Gyro Gearloose; 22.11.2015

Это происходит, когда в вашем коде есть проблема компиляции. Исправьте проблему с компиляцией, чтобы вы могли реорганизовать свой код. Да, эта функция недавно появилась в более новой версии eclipse.

person Naruto    schedule 22.11.2015