CustomParseTreeRewriter.st
author Jakub Nesveda <jakubnesveda@seznam.cz>
Thu, 05 Feb 2015 22:23:57 +0100
changeset 812 8b0a808cefa9
parent 803 95cdac772759
child 828 4c5acc592dc7
permissions -rw-r--r--
Fixed failed tests in CustomRefactoryBuilder RBParser >> parseMethod: returns cached parse trees which can produce misbehaviour when the parse tree is modified
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
629
e85070e8c11b add code selection object (CustomSourceCodeSelection) with code, method, class... to CustomContext
Jakub Nesveda <jakubnesveda@seznam.cz>
parents:
diff changeset
     1
"{ Package: 'jn:refactoring_custom' }"
e85070e8c11b add code selection object (CustomSourceCodeSelection) with code, method, class... to CustomContext
Jakub Nesveda <jakubnesveda@seznam.cz>
parents:
diff changeset
     2
803
95cdac772759 Fixed failing tests caused by new STX release
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 777
diff changeset
     3
"{ NameSpace: Smalltalk }"
95cdac772759 Fixed failing tests caused by new STX release
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 777
diff changeset
     4
777
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
     5
ParseTreeSourceRewriter subclass:#CustomParseTreeRewriter
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
     6
	instanceVariableNames:'oldSource newSource'
629
e85070e8c11b add code selection object (CustomSourceCodeSelection) with code, method, class... to CustomContext
Jakub Nesveda <jakubnesveda@seznam.cz>
parents:
diff changeset
     7
	classVariableNames:''
e85070e8c11b add code selection object (CustomSourceCodeSelection) with code, method, class... to CustomContext
Jakub Nesveda <jakubnesveda@seznam.cz>
parents:
diff changeset
     8
	poolDictionaries:''
e85070e8c11b add code selection object (CustomSourceCodeSelection) with code, method, class... to CustomContext
Jakub Nesveda <jakubnesveda@seznam.cz>
parents:
diff changeset
     9
	category:'Interface-Refactoring-Custom'
e85070e8c11b add code selection object (CustomSourceCodeSelection) with code, method, class... to CustomContext
Jakub Nesveda <jakubnesveda@seznam.cz>
parents:
diff changeset
    10
!
e85070e8c11b add code selection object (CustomSourceCodeSelection) with code, method, class... to CustomContext
Jakub Nesveda <jakubnesveda@seznam.cz>
parents:
diff changeset
    11
e85070e8c11b add code selection object (CustomSourceCodeSelection) with code, method, class... to CustomContext
Jakub Nesveda <jakubnesveda@seznam.cz>
parents:
diff changeset
    12
!CustomParseTreeRewriter class methodsFor:'documentation'!
e85070e8c11b add code selection object (CustomSourceCodeSelection) with code, method, class... to CustomContext
Jakub Nesveda <jakubnesveda@seznam.cz>
parents:
diff changeset
    13
e85070e8c11b add code selection object (CustomSourceCodeSelection) with code, method, class... to CustomContext
Jakub Nesveda <jakubnesveda@seznam.cz>
parents:
diff changeset
    14
documentation
e85070e8c11b add code selection object (CustomSourceCodeSelection) with code, method, class... to CustomContext
Jakub Nesveda <jakubnesveda@seznam.cz>
parents:
diff changeset
    15
"
777
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    16
    Extension for ParseTreeSourceRewriter so that it work even for expressions and not just methods.
629
e85070e8c11b add code selection object (CustomSourceCodeSelection) with code, method, class... to CustomContext
Jakub Nesveda <jakubnesveda@seznam.cz>
parents:
diff changeset
    17
e85070e8c11b add code selection object (CustomSourceCodeSelection) with code, method, class... to CustomContext
Jakub Nesveda <jakubnesveda@seznam.cz>
parents:
diff changeset
    18
    [author:]
e85070e8c11b add code selection object (CustomSourceCodeSelection) with code, method, class... to CustomContext
Jakub Nesveda <jakubnesveda@seznam.cz>
parents:
diff changeset
    19
        Jakub Nesveda <nesvejak@fit.cvut.cz>
e85070e8c11b add code selection object (CustomSourceCodeSelection) with code, method, class... to CustomContext
Jakub Nesveda <jakubnesveda@seznam.cz>
parents:
diff changeset
    20
e85070e8c11b add code selection object (CustomSourceCodeSelection) with code, method, class... to CustomContext
Jakub Nesveda <jakubnesveda@seznam.cz>
parents:
diff changeset
    21
"
e85070e8c11b add code selection object (CustomSourceCodeSelection) with code, method, class... to CustomContext
Jakub Nesveda <jakubnesveda@seznam.cz>
parents:
diff changeset
    22
! !
e85070e8c11b add code selection object (CustomSourceCodeSelection) with code, method, class... to CustomContext
Jakub Nesveda <jakubnesveda@seznam.cz>
parents:
diff changeset
    23
777
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    24
!CustomParseTreeRewriter methodsFor:'accessing'!
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    25
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    26
executeTree: aParseTree
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    27
    "Like ParseTreeSourceRewriter >> executeTree:, but with
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    28
    additional support for expressions"
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    29
    | oldContext treeFromRewrittenSource |
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    30
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    31
    oldContext := context.
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    32
    context := (RBSmallDictionary ? Dictionary) new.
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    33
    answer := false.
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    34
    oldSource isNil ifTrue: [
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    35
        oldSource := aParseTree source
812
8b0a808cefa9 Fixed failed tests in CustomRefactoryBuilder
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 803
diff changeset
    36
    ].  
777
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    37
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    38
    oldSource isNil ifTrue: [ 
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    39
        self error: 'We need the oldSource string to be set'.
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    40
    ].
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    41
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    42
    "/Rewrite the tree as usual and then (try to) rewrite the original source code
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    43
    tree := self visitNode: aParseTree.
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    44
    replacements notNil ifTrue:[
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    45
        newSource := self executeReplacementsInSource: oldSource.
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    46
    ] ifFalse:[
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    47
        ^answer
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    48
    ].
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    49
    "/DO NOT forget rewrites here!!!!!!"
629
e85070e8c11b add code selection object (CustomSourceCodeSelection) with code, method, class... to CustomContext
Jakub Nesveda <jakubnesveda@seznam.cz>
parents:
diff changeset
    50
777
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    51
    "/Now, validates that rewritten parse tree is the same as
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    52
    "/the one we get from the rewritten source:
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    53
    aParseTree isMethod ifTrue: [ 
812
8b0a808cefa9 Fixed failed tests in CustomRefactoryBuilder
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 803
diff changeset
    54
        treeFromRewrittenSource := RBParser parseRewriteMethod: newSource onError:[:error :position|nil].
777
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    55
    ] ifFalse: [ 
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    56
        treeFromRewrittenSource := RBParser parseExpression: newSource onError:[:error :position|nil].
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    57
    ].
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    58
    treeFromRewrittenSource = tree ifTrue:[
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    59
        (tree respondsTo: #source:) ifTrue: [ 
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    60
            tree source: newSource.
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    61
        ].
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    62
    ] ifFalse: [
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    63
        "Better set newSource to nil in order to indicate that something went wrong"
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    64
        newSource := nil.
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    65
    ].
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    66
    context := oldContext.
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    67
    ^answer
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    68
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    69
    "Created: / 09-12-2014 / 21:16:33 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
812
8b0a808cefa9 Fixed failed tests in CustomRefactoryBuilder
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 803
diff changeset
    70
    "Modified: / 05-02-2015 / 22:07:20 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
777
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    71
!
629
e85070e8c11b add code selection object (CustomSourceCodeSelection) with code, method, class... to CustomContext
Jakub Nesveda <jakubnesveda@seznam.cz>
parents:
diff changeset
    72
777
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    73
newSource
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    74
    "Returns the source code string after the replacements were executed"
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    75
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    76
    ^ newSource
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    77
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    78
    "Modified (comment): / 09-12-2014 / 22:19:03 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    79
!
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    80
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    81
oldSource
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    82
    "Returns custom old source code string - the code before replacements were made"
629
e85070e8c11b add code selection object (CustomSourceCodeSelection) with code, method, class... to CustomContext
Jakub Nesveda <jakubnesveda@seznam.cz>
parents:
diff changeset
    83
777
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    84
    ^ oldSource
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    85
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    86
    "Modified (comment): / 09-12-2014 / 21:19:04 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    87
!
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    88
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    89
oldSource: aString
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    90
    "see oldSource"
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    91
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    92
    oldSource := aString
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    93
8f212cf1bb45 Improvemens in CustomRefactoryBuilder - no complete reformatting of method source code, but only the replacement parts
Jakub Nesveda <jakubnesveda@seznam.cz>
parents: 629
diff changeset
    94
    "Modified (comment): / 09-12-2014 / 21:19:59 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
629
e85070e8c11b add code selection object (CustomSourceCodeSelection) with code, method, class... to CustomContext
Jakub Nesveda <jakubnesveda@seznam.cz>
parents:
diff changeset
    95
! !
e85070e8c11b add code selection object (CustomSourceCodeSelection) with code, method, class... to CustomContext
Jakub Nesveda <jakubnesveda@seznam.cz>
parents:
diff changeset
    96