Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
小 白蛋
Intellij Community
Commits
35f8c084
Commit
35f8c084
authored
7 years ago
by
Maxim Kropotov
1
Browse files
Options
Download
Email Patches
Plain Diff
WEB-18490: initial support for jsx in js 'move statement'
parent
533d8ce5
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
xml/impl/src/com/intellij/codeInsight/editorActions/moveUpDown/XmlMover.java
+30
-20
...tellij/codeInsight/editorActions/moveUpDown/XmlMover.java
with
30 additions
and
20 deletions
+30
-20
xml/impl/src/com/intellij/codeInsight/editorActions/moveUpDown/XmlMover.java
+
30
-
20
View file @
35f8c084
...
...
@@ -15,6 +15,7 @@
*/
package
com.intellij.codeInsight.editorActions.moveUpDown
;
import
com.intellij.lang.ASTNode
;
import
com.intellij.lang.injection.InjectedLanguageManager
;
import
com.intellij.openapi.editor.Document
;
import
com.intellij.openapi.editor.Editor
;
...
...
@@ -22,7 +23,6 @@ import com.intellij.openapi.util.TextRange;
import
com.intellij.openapi.util.UnfairTextRange
;
import
com.intellij.psi.PsiElement
;
import
com.intellij.psi.PsiFile
;
import
com.intellij.psi.PsiNamedElement
;
import
com.intellij.psi.PsiWhiteSpace
;
import
com.intellij.psi.impl.source.xml.TagNameVariantCollector
;
import
com.intellij.psi.impl.source.xml.XmlDocumentImpl
;
...
...
@@ -33,14 +33,11 @@ import com.intellij.xml.XmlNSDescriptor;
import
com.intellij.xml.util.HtmlUtil
;
import
org.jetbrains.annotations.NotNull
;
class
XmlMover
extends
LineMover
{
public
class
XmlMover
extends
LineMover
{
//private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.editor.actions.moveUpDown.XmlMover");
@Override
public
boolean
checkAvailable
(
@NotNull
final
Editor
editor
,
@NotNull
final
PsiFile
file
,
@NotNull
final
MoveInfo
info
,
final
boolean
down
)
{
if
(!(
file
instanceof
XmlFile
))
{
return
false
;
}
if
(!
super
.
checkAvailable
(
editor
,
file
,
info
,
down
))
return
false
;
// updated moved range end to cover multiline tag start
...
...
@@ -53,19 +50,19 @@ class XmlMover extends LineMover {
PsiElement
movedStartElement
=
file
.
findElementAt
(
movedLineStart
);
if
(
movedStartElement
instanceof
PsiWhiteSpace
)
movedStartElement
=
PsiTreeUtil
.
nextLeaf
(
movedStartElement
);
if
(
movedEndElement
==
null
||
movedStartElement
==
null
)
return
false
;
final
PsiNamedElement
namedParentAtEnd
=
PsiTreeUtil
.
getParentOfType
(
moved
End
Element
,
PsiNamedElement
.
class
);
final
PsiNamedElement
namedPar
entAtStart
=
PsiTreeUtil
.
getParentOfType
(
movedStartElement
,
PsiNamedElement
.
class
)
;
final
XmlElement
xmlElementAtEnd
=
PsiTreeUtil
.
getParentOfType
(
movedEndElement
,
XmlTag
.
class
,
XmlAttribute
.
class
)
;
final
XmlElement
xmlElementAtStart
=
PsiTreeUtil
.
getParentOfType
(
moved
Start
Element
,
XmlTag
.
class
,
XmlAttribute
.
class
);
if
(
xmlElem
entAtStart
=
=
null
||
xmlElementAtEnd
==
null
)
return
false
;
if
(
checkInjections
(
movedEndElement
,
movedStartElement
))
return
false
;
PsiNamed
Element
movedParent
=
null
;
Xml
Element
movedParent
=
null
;
if
(
namedPar
entAtEnd
==
namedPar
entAtStart
)
movedParent
=
namedPar
entAtEnd
;
else
if
(
namedPar
entAtEnd
instanceof
XmlAttribute
&&
namedPar
entAtStart
instanceof
XmlTag
&&
namedPar
entAtEnd
.
getParent
()
==
namedPar
entAtStart
)
{
movedParent
=
namedPar
entAtStart
;
}
else
if
(
namedPar
entAtStart
instanceof
XmlAttribute
&&
namedPar
entAtEnd
instanceof
XmlTag
&&
namedPar
entAtStart
.
getParent
()
==
namedPar
entAtEnd
)
{
movedParent
=
namedPar
entAtEnd
;
if
(
xmlElem
entAtEnd
==
xmlElem
entAtStart
)
movedParent
=
xmlElem
entAtEnd
;
else
if
(
xmlElem
entAtEnd
instanceof
XmlAttribute
&&
xmlElem
entAtStart
instanceof
XmlTag
&&
xmlElem
entAtEnd
.
getParent
()
==
xmlElem
entAtStart
)
{
movedParent
=
xmlElem
entAtStart
;
}
else
if
(
xmlElem
entAtStart
instanceof
XmlAttribute
&&
xmlElem
entAtEnd
instanceof
XmlTag
&&
xmlElem
entAtStart
.
getParent
()
==
xmlElem
entAtEnd
)
{
movedParent
=
xmlElem
entAtEnd
;
}
if
(
movedParent
==
null
)
{
...
...
@@ -81,7 +78,7 @@ class XmlMover extends LineMover {
// the only top-level tag
return
info
.
prohibitMove
();
}
final
TextRange
valueRange
=
tag
.
getValue
().
getTex
tRange
();
final
TextRange
valueRange
=
getTagConten
tRange
(
tag
);
final
int
valueStart
=
valueRange
.
getStartOffset
();
if
(
HtmlUtil
.
isHtmlTag
(
tag
)
&&
(
HtmlUtil
.
isScriptTag
(
tag
)
||
HtmlUtil
.
STYLE_TAG_NAME
.
equals
(
tag
.
getName
())))
{
...
...
@@ -111,7 +108,7 @@ class XmlMover extends LineMover {
final
XmlTag
parent
=
((
XmlAttribute
)
movedParent
).
getParent
();
if
(
parent
!=
null
)
{
final
TextRange
valueRange
=
parent
.
getValue
().
getTex
tRange
();
final
TextRange
valueRange
=
getTagConten
tRange
(
parent
);
// Do not move attributes out of tags
if
(
(
down
&&
moveDestinationRange
.
getEndOffset
()
>=
valueRange
.
getStartOffset
())
||
...
...
@@ -127,14 +124,14 @@ class XmlMover extends LineMover {
if
(
updatedElement
instanceof
PsiWhiteSpace
)
updatedElement
=
PsiTreeUtil
.
prevLeaf
(
updatedElement
);
if
(
updatedElement
!=
null
)
{
final
PsiNamed
Element
targetParent
=
PsiTreeUtil
.
getParentOfType
(
updatedElement
,
movedParent
.
getClass
());
final
Xml
Element
targetParent
=
PsiTreeUtil
.
getParentOfType
(
updatedElement
,
movedParent
.
getClass
());
if
(
targetParent
instanceof
XmlTag
)
{
if
(
targetParent
==
movedParent
)
return
false
;
if
(
moveTags
(
info
,
(
XmlTag
)
movedParent
,
(
XmlTag
)
targetParent
,
down
))
return
true
;
final
XmlTag
tag
=
(
XmlTag
)
targetParent
;
final
int
offset
=
tag
.
isEmpty
()
?
tag
.
getTextRange
().
getStartOffset
()
:
tag
.
getValue
().
getTex
tRange
().
getStartOffset
();
final
int
offset
=
tag
.
isEmpty
()
?
tag
.
getTextRange
().
getStartOffset
()
:
getTagConten
tRange
(
tag
).
getStartOffset
();
updatedMovedIntoEnd
(
document
,
info
,
offset
);
if
(
tag
.
isEmpty
())
{
info
.
toMove2
=
new
LineRange
(
targetParent
);
...
...
@@ -148,11 +145,11 @@ class XmlMover extends LineMover {
if
(
updatedElement
instanceof
PsiWhiteSpace
)
updatedElement
=
PsiTreeUtil
.
nextLeaf
(
updatedElement
);
if
(
updatedElement
!=
null
)
{
final
PsiNamed
Element
targetParent
=
PsiTreeUtil
.
getParentOfType
(
updatedElement
,
movedParent
.
getClass
());
final
Xml
Element
targetParent
=
PsiTreeUtil
.
getParentOfType
(
updatedElement
,
movedParent
.
getClass
());
if
(
targetParent
instanceof
XmlTag
)
{
final
XmlTag
tag
=
(
XmlTag
)
targetParent
;
final
TextRange
tagValueRange
=
tag
.
getValue
().
getTex
tRange
();
final
TextRange
tagValueRange
=
getTagConten
tRange
(
tag
);
// We need to update destination range to jump over tag start
final
XmlTag
[]
subtags
=
tag
.
getSubTags
();
...
...
@@ -181,6 +178,19 @@ class XmlMover extends LineMover {
return
true
;
}
@NotNull
private
static
TextRange
getTagContentRange
(
@NotNull
XmlTag
parent
)
{
//JSX has different rules re: whitespace, so getValue().getTextRange() does not include leading / trailing whitespace
if
(!
parent
.
isEmpty
())
{
final
ASTNode
startTagEnd
=
XmlChildRole
.
START_TAG_END_FINDER
.
findChild
(
parent
.
getNode
());
ASTNode
endTagStart
=
XmlChildRole
.
CLOSING_TAG_START_FINDER
.
findChild
(
parent
.
getNode
());
if
(
startTagEnd
!=
null
&&
endTagStart
!=
null
)
{
return
new
TextRange
(
startTagEnd
.
getTextRange
().
getEndOffset
(),
endTagStart
.
getTextRange
().
getStartOffset
());
}
}
return
parent
.
getValue
().
getTextRange
();
}
private
static
boolean
moveTags
(
MoveInfo
info
,
XmlTag
moved
,
XmlTag
target
,
boolean
down
)
{
if
(
target
.
getParent
()
==
moved
)
{
// we are going to jump into our own children
...
...
This diff is collapsed.
Click to expand it.
小 白蛋
@baidan
mentioned in commit
76788ef4
·
2 years ago
mentioned in commit
76788ef4
mentioned in commit 76788ef47bac39e09f5f2784abed662ed6e48c90
Toggle commit list
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment