|
이 섹션은 이 복잡하지만 매우 강력한 구성 요소를 이용하는 것을 당신이 시작하는 것을 지원하는 유용한 몇 개의 Usecases를 제공할 뿐만 아니라 Structured
Search&Replace 특징, 그 기능, 통제를 기술합니다.
Structured Search&Replace 는 당신이 검색하는 것을 가능하게 하고, 필요하다면 패턴을 사용하여 자바 코드의 조각을 교체하기 위해 사용하고 있는 자바-인식이 있는 검색 및 교체 메커니즘입니다.
실제로 Structured
Search&Replace는 2 다이얼로그를 포함합니다. 첫 번째는 패턴을 사용하고 있는 자바 코드 내에서 검색하는 Structural Search 입니다. 그것은 Search | Search
structurally 선택하거나 Ctrl
+ Shift + S 눌러서 불려질 수 있습니다. 그것은 패턴과 함께 자바 코드를 위해 검색하기 위해 사용됩니다.

다른 것은 패턴을 사용하고 있는 자바 코드를 검색하고, 교체하는 Structural Replace입니다. 그것은 Search |
Replace structurally를 선택하거나 Ctrl + Shift + M을 눌러서 불려집니다.

다이얼로그는 공통의 로트를 가지고, Structured
Search&Replace를 위해 필요한 추가와 함께 기술될 것입니다.
다이얼로그의 주요 부분은 Search template과 Search
template/Replacement template 입니다. 그들은 일치하는 패턴을 검색하거나 교체하는 데 사용하는 템플릿을 포함합니다. 각각의 Search 템플릿은 클래스/인터페이스/스테이트먼트/스테이트먼트 세트/표현식/코멘트/Javadoc 코멘트 라고 가정하며 각각의 Replace 템플릿은 자바 관점에서 정확한 구문과 함께 스테이트먼트/스테이트먼트 세트/표현식이 되는 것으로 가정합니다. 그리고 템플릿 내의 어떤 이름이라도 변수와 함께 치환될 수 있습니다. 변수는 $ 기호 내에 써지는 이름입니다. 예를 들면, $Variable$ 입니다. IDEA은 생성된 템플릿을 분석하고 패턴은 정확한 자바 구문을 가져야만 한다라는 정확한 검색 결과를 얻기 위해 자바 인식의 엔진을 사용합니다.
|

|
Replacement template 은 Search template에서 사용되는 변수만을 포함할 수 있습니다.
|
템플릿을 쓰면서, 몇 개의 단축키를 이용할 수 있습니다:
메소드 보디는 생략될 수 있습니다.
만일 어떤 접근 변경자도 표시되지 않으면, 어떤 접근 변경자라도 존중 받을 것입니다.
제약 필드에서뿐만 아니라 템플릿에서 짧은 클래스 이름(충분히 자격이 주어지는 것 대신에)를 사용하십시오.
템플릿으로서 class
$Class$를 사용하면서, 익명의 클래스는 또 발견될 것입니다.
코멘트와 Javadoc를 위한 템플릿은 정확한 코멘트와 Javadoc 구문과 함께 변수와 구성소를 포함해야만 합니다.
IDEA은 기존 템플릿 다이얼로그에 리스트 된 한 세트의 디폴트 템플릿을 가집니다. 사용자는 user defined 아래 거기에서 또한 보여지는 자기 자신의 템플릿을 정의할 수 있습니다.
그들이 발견했던 템플릿과 패턴은 템플릿 창 아래에 위치하는 4개의 버튼을 사용하면서 관리될 수 있습니다.
|
Save template...
|
만일 눌려지면, Save template 다이얼로그를 부르십시오.

Input template name 텍스트 필드에 원하는 템플릿 이름을 다른 사용자 정의의 템플릿을 저장하기 위해 입력하십시오.
|
|
Edit variables...
|
템플릿 변수를 위해 제약을 설정하는 변수 편집 다이얼로그를 부르십시오.
|
|
History...
|
Used Templates History 다이얼로그를 부르십시오.

당신은 최고 25개의 최종 호출된 템플릿을 볼 수 있습니다.
그것을 다시 부르는 Template
preview 텍스트 필드에서 당신이 필요한 하나를 선택하십시오.
|
|
Copy
existing template...
|
사전 정의 또는 사용자 정의 템플릿을 편집하고 또는 적용하도록 Existing
Template를 부르십시오.

다이얼로그는 상응하는 트리 뷰 노드와 함께 마크된 몇 개의 그룹으로 나눠지는 사전 정의의 템플릿을 포함합니다 (expressions, operators, class-based, generics 등과 같은).
또한 사용자 정의의 템플릿을 저장하기 위해 특별한 노드, user
defined가 있습니다.
템플릿을 선택하면서, 당신은 Template
preview 필드에서 그것을 볼 것입니다. Search template 또는 Search/Replacement template 텍스트 필드에서 템플릿을 생성하기 위해, OK 를 누르십시오.
|

|
현재 사용한 템플릿 그룹은 다이얼로그 타이틀 바에 나타납니다.
|
|
|
다이얼로그는 Options 옵션 그룹을 가집니다.
|
Recursive matching
|
만일 선택되면, 결과에서도 재귀적으로 선택합니다. 구성된 검색에만 이용할 수 있는.
|
|
Case sensitive
|
만일 선택되면, 검색을 수행하고 있는 대문자와 소문자는 틀립니다.
|
|
Maximum matches
|
만일 선택되면, 당신으로 하여금 당신이 얻을 많은 매치를 결정할 수 있도록 합니다.
디폴트로, 그것은 1000입니다.
|
|
Shorten fully qualified
names
|
패턴 텍스트가 충분히 자격이 주어지는 클래스 이름을 포함할 경우에 이 옵션은 뜻이 통합니다.
만일 체크 박스가 선택되면, IDEA은 패턴 내에서 이 이름을 자동적으로 줄일 것입니다.
그렇지 않으면, 충분히 자격이 주어지는 클래스 이름은 사용됩니다.
Structured search and replace에서만 이용할 수 있는.
|
|
Format according to
style
|
만일 IDEA가 당신의 코드 스타일 설정(상세한 것은, 섹션 코드 스타일 옵션 을 참조)에 따라 확장시키게 되는 코드 프래그먼트를 자동적으로 재포맷하기 바라면 이 체크 박스를 선택하십시오.
만일 체크 박스가 선택되지 않으면, 그 포매팅을 그대로 놓고 그것이 확장시키게 되는 코드에서 IDEA는 단지 위치에 따라 전체의 템플릿을 들여쓰기 할 것입니다.
Structured search and replace에서만 이용할 수 있는.
|
|
Scope 드롭-다운 목록은 검색/교체를 실제로 하게 되는 범위의 목록을 포함합니다. 사전 정의의 범위를 선택하거나 또는 ellipsis 버튼을 눌러 불려지는 범위 편집 다이얼로그를 사용하여 당신 자신의 것을 생성하십시오. 사용자 정의 범위는 또한 목록에 나타날 것입니다.
다이얼로그에서 새로운 검색 결과가 이전의 것을 교체할 것이든지, 또는 새로운 탭이 열릴 것이든 새로운 탭 체크 박스에서 열리는 Open in
new tab 체크 박스를 선택하십시오.
다이얼로그는 당신이 템플릿에서 제약과 상태를 모든 변수에 맞추는 것을 가능하게 합니다. 제약은 3개의 옵션 그룹으로 나눠집니다.

Text constraints은 규칙적이고 펄(Perl)과 같은 표현식 형태로 또는 클래스 이름으로서 설정된 상태입니다.
|
Text/regular expression
|
펄과 같은 표현식 또는 클래스 이름을 가변 제약으로서 사용되기 위해 타이프하십시오.
클래스 이름을 위해 당신은 기본 코드 완성을 이용할 수 있습니다.
|
|
Invert condition
|
만일 선택되면, 텍스트 패턴은 변환시키게 됩니다.
|
|
Apply constraint within
type hierarchy
|
룩업 패턴이 타입 이름일 때 그것은 의미를 가집니다. 만일 선택되면, 패턴 매치는 단지 타입 이름에서가 아니라 부모에서(계층 내에서) 검색됩니다.
|
|
Whole words only
|
만일 선택되면, 텍스트 내의 전체의 단어가 검색됩니다.
그것은 문자열 리터럴과 코멘트를 위해 의미를 가집니다.
|
|
Occurrences count 는 얼마나 많은 순차적 요소(매개 변수, 선언 또는 스테이트먼트 목록에)와 변수가 포함할 수 있는 지를 설정합니다.
|
Minimum count
|
목록의 최소의 요소 수.
|
|
Maximum count
|
목록의 최대한의 요소 수.
|
|
|

|
변수가 있거나 또는 없는 것을 설정하기 위해서 Minimum
count 에 0
그리고 Maximum
count 에 1을 설정하십시오.
|
Expression constraints 변수 표현식을 위한 제약을 설정합니다.
|
Value is read
|
만일 선택되면, 일치하고 있는 변수는 읽힙니다.
|
|
Value is written
|
만일 선택되면, 일치하고 있는 변수는 써집니다.
|
|
Text/regular expression
for java expression type
|
만일 입력되면, 표현식 타입은 계층에서 검색됩니다.
|
|
Apply constraint within
type hierarchy
|
룩업 패턴이 타입 이름일 때 그것은 의미를 가집니다. 만일 선택되면, 패턴 매치는 단지 타입 이름에서가 아니라 부모에서(계층 내에서) 검색됩니다.
|
|
Invert condition
|
만일 선택되면, 상응하는 체크 박스 값은 변환시키게 됩니다.
|
|
최종 체크(This
variable is target of the search) 이 선택되면, 검색 결과는 전체 표현식이 아니고 선택된 변수만이 보여질 것입니다.
|

|
대부분의
질의 패턴은 기존 템플릿 다이얼로그에
벌써 존재합니다.
|
Search
patterns
1.
Elementary patterns:
$Statement$; pattern matches one statement. Increasing Occurrences
count | Maximum count to, for instance, 5, makes it to find
sequences having 1 to 5 statements.
$Instance$.$MethodCall$($Arguments$) pattern
matches method call expressions. We can specify that method call could be
absent by specifying that Occurrences count | Minimal count for the Instance variable
is set to zero. Also we could request finding method calls with 3 to 5
parameters by specifying Minimal count = 3, Maximum
count = 5 for the Argument variable.
2.
To search for all if
statements we could specify the following pattern:
if ($Expr$)
{
$ThenStatements$;
} else {
$ElseStatements$;
}
Occurrences count minimum and maximum values for the ThenStatements and ElseStatements variables are set to
0 and MaxIntValue,
respectively.
3.
Search in comments and/or string literals:
Consider one wants to find comments or literal containing 'foo'. Search
pattern would be like $SomethingWeWantToFind$ or "$SomethingWeWantToFind$".
Text pattern for "$SomethingWeWantToFind$" should
define comment / literal content of interest (for our example
.*foo.*).
In case one wants to find comments/string containing some particular words
(say, foo as word), then Whole words only option
for a variable constraint should be set. Text constraint contains word(s) one
want to find (foo for our example).
4.
More specific usages of class/interface
methods (fields), for instance, equals, etc. which are
accessed through descendants (e.g. searching equals called
from instances of BaseComponentClass type
descendants).
The pattern would be $Instance$.equals($Parameter$). The Instance variable
will have name of the java expression type set to short name of the class (BaseComponentClass), the Apply
constraint in type hierarchy option in the Expression
constraints group should be set as well.
5.
Let's consider finding all method
implementations (say, all methods named show in JComponent descendants):
The search query should be as follows:
class $Class$ extends $JComponent$
{
public
void $Show$();
}
Text constraint for the JComponent variable
should be JComponent, with
type hierarchy in the Text constraint group set to true. Text constraint for
the Show variable should be shown with the This variable is target of the search
option set to true (since we are looking for methods) as well. Class
members will be searched without regard to the order of members in the
classes being searched.
Replace
patterns
oReplacement
of empty length array creation with constant static ones.
The search pattern could be following:
new PsiElement[0]
And the replacement pattern:
PsiElement.EMPTY_ARRAY
oAdd try/catch/finally code.
The search pattern is $Statements$; where the Occurrences
count maximum value is Integer.MAX_VALUE.
The replacement pattern is the following:
try {
$Statements$;
} catch (Exception ex) {
}
To remove such code one needs to revert replace/search patterns.
|