DoWhatIMeanSupport.st
author Claus Gittinger <cg@exept.de>
Fri, 19 Jun 2015 00:18:06 +0200
changeset 4784 7c4d1f1a6b30
parent 4780 ac7e1d23c65b
child 4823 76bba777a498
permissions -rw-r--r--
class: DoWhatIMeanSupport comment/format in: #codeCompletionForMethodSpec:into: changed: #codeCompletionForVariable:into: completion of common argnames such as aBoolean, anInteger etc.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     1
"
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     2
 COPYRIGHT (c) 2002 by eXept Software AG
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
     3
	      All Rights Reserved
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     4
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     5
 This software is furnished under a license and may be used
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
 hereby transferred.
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    11
"
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    12
"{ Package: 'stx:libwidg2' }"
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
    14
"{ NameSpace: Smalltalk }"
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
    15
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    16
Object subclass:#DoWhatIMeanSupport
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
    17
	instanceVariableNames:'tree tokens languageOrNil classOrNil methodOrNil contextOrNil
4434
b15ce7d47dd8 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4433
diff changeset
    18
		instanceOrNil codeView rememberedScopeNodes rememberedNodes
b15ce7d47dd8 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4433
diff changeset
    19
		codeAspect'
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
    20
	classVariableNames:'LastSource LastParseTree LastScanTokens LastChoices'
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    21
	poolDictionaries:''
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
	category:'System-Support'
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    23
!
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    24
3854
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
    25
Array variableSubclass:#InputCompletionResult
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
    26
	instanceVariableNames:''
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
    27
	classVariableNames:''
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
    28
	poolDictionaries:''
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
    29
	privateIn:DoWhatIMeanSupport
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
    30
!
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
    31
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    32
!DoWhatIMeanSupport class methodsFor:'documentation'!
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    33
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    34
copyright
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    35
"
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    36
 COPYRIGHT (c) 2002 by eXept Software AG
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
    37
	      All Rights Reserved
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    38
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
 This software is furnished under a license and may be used
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
 only in accordance with the terms of that license and with the
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
 inclusion of the above copyright notice.   This software may not
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
 be provided or otherwise made available to, or used by, any
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
 other person.  No title to or ownership of the software is
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
 hereby transferred.
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
"
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    46
!
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
documentation
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    49
"
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
    50
    Attention: this is currently being rewritten and refactored.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
    51
    Don't get mad at the ugly (and duplicate) code.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
    52
    Will cleanup when finished.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
    53
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    54
    misc collected UI support (functional)
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
    55
    These used to be in the Smalltalk and SystemBrowser class;
3299
1cd4b22434a6 code completion stuff moved to here (for reuse)
Claus Gittinger <cg@exept.de>
parents: 3198
diff changeset
    56
    however, they are only needed for programmers, and some of the stuff is useful in multiple
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
    57
    places.
3667
acb358ca4b0b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3660
diff changeset
    58
    Therefore it is:
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
    59
	1) not needed for standalone executables
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
    60
	2) published here to avoid multiple implementations
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    61
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    62
    [author:]
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
    63
	Claus Gittinger (cg@exept.de)
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    64
3299
1cd4b22434a6 code completion stuff moved to here (for reuse)
Claus Gittinger <cg@exept.de>
parents: 3198
diff changeset
    65
"
1cd4b22434a6 code completion stuff moved to here (for reuse)
Claus Gittinger <cg@exept.de>
parents: 3198
diff changeset
    66
! !
1cd4b22434a6 code completion stuff moved to here (for reuse)
Claus Gittinger <cg@exept.de>
parents: 3198
diff changeset
    67
1cd4b22434a6 code completion stuff moved to here (for reuse)
Claus Gittinger <cg@exept.de>
parents: 3198
diff changeset
    68
!DoWhatIMeanSupport class methodsFor:'code completion'!
1cd4b22434a6 code completion stuff moved to here (for reuse)
Claus Gittinger <cg@exept.de>
parents: 3198
diff changeset
    69
4426
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
    70
codeCompletionFor: aspect language: languageOrNil method:methodOrNil orClass:classOrNil context:contextOrNil codeView:codeView into:actionBlock
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
    71
    "aspect is so-called code-aspect symbol saying what's edited - #method, #expression, #classDefinition...
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
    72
     contextOrNil is the current context, if this is called from the debugger;
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
    73
     nil, if called from the browser.
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
    74
     If nonNil, we can make better guesses, 
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
    75
     because we actually know what a variable's type is."
4426
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
    76
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
    77
    ^ self new
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
    78
        codeCompletionFor: aspect
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
    79
        language: languageOrNil
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
    80
        method:methodOrNil orClass:classOrNil
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
    81
        context:contextOrNil
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
    82
        codeView:codeView into:actionBlock
4426
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
    83
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
    84
    "Created: / 27-09-2013 / 10:19:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
    85
!
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
    86
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
    87
codeCompletionForLanguage: languageOrNil class: classOrNil context:contextOrNil codeView:codeView
3900
82fa031be815 comment/format in: #codeCompletionForClass:context:codeView:
Claus Gittinger <cg@exept.de>
parents: 3896
diff changeset
    88
    "contextOrNil is the current context, if this is called from the debugger;
3557
a001bf3df400 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3554
diff changeset
    89
     nil, if called from the browser.
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
    90
     If nonNil, we can make better guesses, 
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
    91
     because we actually know what a variable's type is."
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
    92
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
    93
    ^ self new
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
    94
        codeCompletionForLanguage: languageOrNil 
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
    95
        class:classOrNil 
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
    96
        context:contextOrNil 
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
    97
        codeView:codeView
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
    98
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
    99
    "Created: / 18-09-2013 / 13:34:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
   100
! !
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
   101
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
   102
!DoWhatIMeanSupport class methodsFor:'code completion - obsolete'!
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
   103
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
   104
codeCompletionForClass:classOrNil context:contextOrNil codeView:codeView
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
   105
    <resource: #obsolete>
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
   106
    "contextOrNil is the current context, if this is called from the debugger;
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
   107
     nil, if called from the browser.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
   108
     If nonNil, we can make better guesses, because we actually know what a variable's type is.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
   109
     This is not yet done, sigh"
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
   110
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   111
    ^ self
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   112
	codeCompletionForLanguage: nil class:classOrNil context:contextOrNil codeView:codeView
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
   113
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
   114
    "Modified: / 18-09-2013 / 13:34:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
   115
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
   116
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
   117
codeCompletionForMethod:methodOrNil orClass:classOrNil context:contextOrNil codeView:codeView into:actionBlock
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
   118
    <resource: #obsolete>
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
   119
    "contextOrNil is the current context, if this is called from the debugger;
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
   120
     nil, if called from the browser.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
   121
     If nonNil, we can make better guesses, because we actually know what a variable's type is.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
   122
     This is not yet done, sigh"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
   123
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
   124
    ^ self new
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   125
	codeCompletionForMethod:methodOrNil orClass:classOrNil
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   126
	context:contextOrNil
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   127
	codeView:codeView into:actionBlock
3299
1cd4b22434a6 code completion stuff moved to here (for reuse)
Claus Gittinger <cg@exept.de>
parents: 3198
diff changeset
   128
! !
1cd4b22434a6 code completion stuff moved to here (for reuse)
Claus Gittinger <cg@exept.de>
parents: 3198
diff changeset
   129
1cd4b22434a6 code completion stuff moved to here (for reuse)
Claus Gittinger <cg@exept.de>
parents: 3198
diff changeset
   130
!DoWhatIMeanSupport class methodsFor:'code completion-helpers'!
1cd4b22434a6 code completion stuff moved to here (for reuse)
Claus Gittinger <cg@exept.de>
parents: 3198
diff changeset
   131
3300
e0f4bf68e26a codeCompletion refactored
Claus Gittinger <cg@exept.de>
parents: 3299
diff changeset
   132
findNodeForInterval:interval in:source
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
   133
    ^ self new findNodeForInterval:interval in:source
3300
e0f4bf68e26a codeCompletion refactored
Claus Gittinger <cg@exept.de>
parents: 3299
diff changeset
   134
!
e0f4bf68e26a codeCompletion refactored
Claus Gittinger <cg@exept.de>
parents: 3299
diff changeset
   135
3299
1cd4b22434a6 code completion stuff moved to here (for reuse)
Claus Gittinger <cg@exept.de>
parents: 3198
diff changeset
   136
findNodeForInterval:interval in:source allowErrors:allowErrors
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
   137
    ^ self new findNodeForInterval:interval in:source allowErrors:allowErrors
4080
413b8c8a0161 added: #findNodeForInterval:in:allowErrors:mustBeMethod:
Claus Gittinger <cg@exept.de>
parents: 4070
diff changeset
   138
!
413b8c8a0161 added: #findNodeForInterval:in:allowErrors:mustBeMethod:
Claus Gittinger <cg@exept.de>
parents: 4070
diff changeset
   139
413b8c8a0161 added: #findNodeForInterval:in:allowErrors:mustBeMethod:
Claus Gittinger <cg@exept.de>
parents: 4070
diff changeset
   140
findNodeForInterval:interval in:source allowErrors:allowErrors mustBeMethod:mustBeMethod
413b8c8a0161 added: #findNodeForInterval:in:allowErrors:mustBeMethod:
Claus Gittinger <cg@exept.de>
parents: 4070
diff changeset
   141
    "if mustBeMethod is true, do not try a regular expression (as in a workspace)."
413b8c8a0161 added: #findNodeForInterval:in:allowErrors:mustBeMethod:
Claus Gittinger <cg@exept.de>
parents: 4070
diff changeset
   142
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
   143
    ^ self new
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   144
	findNodeForInterval:interval in:source allowErrors:allowErrors mustBeMethod:mustBeMethod
3306
40e860fd2f02 argument-name completion in a methods selector pattern
Claus Gittinger <cg@exept.de>
parents: 3303
diff changeset
   145
!
40e860fd2f02 argument-name completion in a methods selector pattern
Claus Gittinger <cg@exept.de>
parents: 3303
diff changeset
   146
40e860fd2f02 argument-name completion in a methods selector pattern
Claus Gittinger <cg@exept.de>
parents: 3303
diff changeset
   147
findNodeForInterval:interval inParseTree:parseTree
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
   148
    ^ self new findNodeForInterval:interval inParseTree:parseTree
3299
1cd4b22434a6 code completion stuff moved to here (for reuse)
Claus Gittinger <cg@exept.de>
parents: 3198
diff changeset
   149
!
1cd4b22434a6 code completion stuff moved to here (for reuse)
Claus Gittinger <cg@exept.de>
parents: 3198
diff changeset
   150
1cd4b22434a6 code completion stuff moved to here (for reuse)
Claus Gittinger <cg@exept.de>
parents: 3198
diff changeset
   151
findNodeIn:tree forInterval:interval
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
   152
    ^ self new findNodeIn:tree forInterval:interval
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   153
! !
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   154
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   155
!DoWhatIMeanSupport class methodsFor:'input completion support'!
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   156
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   157
classCategoryCompletion:aPartialCategory inEnvironment:anEnvironment
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   158
    "given a partial class category name, return an array consisting of
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   159
     2 entries: 1st: the best (longest) match
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   160
		2nd: collection consisting of matching categories"
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   161
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   162
    |matches best lcName|
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   163
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   164
    matches := IdentitySet new.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   165
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   166
    "/ search for exact match
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   167
    anEnvironment allClassesDo:[:aClass |
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   168
	|category|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   169
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   170
	category := aClass category.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   171
	(category notNil and:[category startsWith:aPartialCategory]) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   172
	    matches add:category
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   173
	]
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   174
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   175
    matches isEmpty ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   176
	"/ search for case-ignoring match
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   177
	lcName := aPartialCategory asLowercase.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   178
	anEnvironment allClassesDo:[:aClass |
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   179
	    |category|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   180
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   181
	    category := aClass category.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   182
	    (category notNil and:[category asLowercase startsWith:lcName]) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   183
		matches add:category
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   184
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   185
	].
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   186
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   187
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   188
    matches isEmpty ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   189
	^ Array with:aPartialCategory with:(Array with:aPartialCategory)
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   190
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   191
    matches size == 1 ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   192
	^ Array with:matches first with:(matches asArray)
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   193
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   194
    matches := matches asSortedCollection.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   195
    best := matches longestCommonPrefix.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   196
    ^ Array with:best with:matches asArray
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   197
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   198
    "
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   199
     Smalltalk classCategoryCompletion:'Sys'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   200
     Smalltalk classCategoryCompletion:'System'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   201
     Smalltalk classCategoryCompletion:'System-BinaryStorage'
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   202
    "
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   203
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   204
    "Created: / 10-08-2006 / 13:06:45 / cg"
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   205
!
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   206
2830
dbf8a7499ebc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2774
diff changeset
   207
classNameEntryCompletionBlock
dbf8a7499ebc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2774
diff changeset
   208
    "this block can be used in a dialog to perform className completion"
dbf8a7499ebc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2774
diff changeset
   209
2977
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   210
    ^ self entryCompletionBlockFor:#'classnameCompletion:inEnvironment:'
2830
dbf8a7499ebc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2774
diff changeset
   211
2977
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   212
    "Modified: / 10-08-2006 / 13:22:02 / cg"
2830
dbf8a7499ebc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2774
diff changeset
   213
!
dbf8a7499ebc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2774
diff changeset
   214
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   215
classnameCompletion:aPartialClassName filter:filterBlock inEnvironment:anEnvironment
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   216
    "given a partial classname, return an array consisting of
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   217
     2 entries: 1st: the best (longest) match
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   218
		2nd: collection consisting of matching names"
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   219
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   220
    |searchName matches matchedNamesWithoutPrefix ignCaseMatches best isMatchString cls nsPrefix
3876
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   221
     others lcSearchName tryToMatch idx words w1 w2 rslt bestMatch matchesForLongestPrefix|
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   222
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   223
    aPartialClassName isEmpty ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   224
	matches := Smalltalk allClassesForWhich:filterBlock.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   225
	^ InputCompletionResult bestName:aPartialClassName matchingNames:#()
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   226
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   227
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   228
    (words := aPartialClassName asCollectionOfWords) size > 1 ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   229
	w1 := words first.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   230
	w2 := words second.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   231
	rslt := self classnameCompletion:w1 filter:filterBlock inEnvironment:anEnvironment.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   232
	bestMatch := rslt first.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   233
	matches := rslt second.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   234
	('class' copyTo:(w2 size min:5)) = w2 ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   235
	    matches := matches collect:[:m | m , ' class'].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   236
	    bestMatch := bestMatch , ' class'.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   237
	].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   238
	^ InputCompletionResult bestName:bestMatch matchingNames:matches
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   239
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   240
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   241
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   242
    (aPartialClassName startsWith:'Smalltalk::') ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   243
	nsPrefix := 'Smalltalk::'.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   244
	searchName := aPartialClassName withoutPrefix:'Smalltalk::'
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   245
    ] ifFalse:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   246
	nsPrefix := ''.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   247
	searchName := aPartialClassName.
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   248
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   249
3876
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   250
    searchName := searchName asUppercaseFirst.
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   251
    lcSearchName := searchName asLowercase.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   252
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   253
    isMatchString := searchName includesMatchCharacters.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   254
    matches := OrderedCollection new.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   255
    matchedNamesWithoutPrefix := Set new.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   256
    ignCaseMatches := OrderedCollection new.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   257
    others := OrderedCollection new.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   258
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   259
    tryToMatch :=
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   260
	[:className :fullClassName|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   261
	    |addIt|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   262
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   263
	    isMatchString ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   264
		addIt := searchName match:className
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   265
	    ] ifFalse:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   266
		addIt := className startsWith:searchName.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   267
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   268
	    addIt ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   269
		matches add:(nsPrefix , fullClassName).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   270
		matchedNamesWithoutPrefix add:className.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   271
	    ] ifFalse:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   272
		"/ try ignoring case
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   273
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   274
		isMatchString ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   275
		    addIt := searchName match:className caseSensitive:false
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   276
		] ifFalse:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   277
		    addIt := className asLowercase startsWith:lcSearchName.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   278
		    addIt ifFalse:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   279
			others add:className
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   280
		    ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   281
		].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   282
		addIt ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   283
		    ignCaseMatches add:(nsPrefix , fullClassName).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   284
		    matchedNamesWithoutPrefix add:className.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   285
		].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   286
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   287
	    addIt
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   288
	].
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   289
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   290
    anEnvironment allClassesForWhich:filterBlock do:[:aClass |
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   291
	|addIt fullClassName classNameWithoutPrefix|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   292
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   293
	aClass isMeta ifFalse:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   294
	    fullClassName := aClass name.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   295
	    classNameWithoutPrefix := aClass nameWithoutPrefix.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   296
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   297
	    addIt := tryToMatch value:fullClassName value:fullClassName.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   298
	    addIt ifFalse:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   299
		classNameWithoutPrefix ~~ fullClassName ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   300
		    tryToMatch value:classNameWithoutPrefix value:fullClassName.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   301
		].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   302
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   303
	]
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   304
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   305
3876
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   306
"/    matches isEmpty ifTrue:[
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   307
"/        matches := ignCaseMatches.
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   308
"/    ].
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   309
    matches := matches , ignCaseMatches.
3854
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
   310
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   311
"/    matches isEmpty ifTrue:[
3876
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   312
"/        matches := ignCaseMatches.
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   313
"/
3876
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   314
"/"/    matches isEmpty ifTrue:[
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   315
"/"/        | nearBy |
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   316
"/"/        nearBy := SortedCollection new sortBlock:[:a :b | a key < b key].
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   317
"/"/        others do:[:className |
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   318
"/"/            |lcClassName dist cmpName|
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   319
"/"/
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   320
"/"/            lcClassName := className asLowercase.
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   321
"/"/            dist := lcClassName levenshteinTo:lcSearchName s:9 k:1 c:0 i:9 d:2.
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   322
"/"/
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   323
"/"/            cmpName := lcClassName copyTo:(lcSearchName size min:lcClassName size).
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   324
"/"/            dist := dist min:(cmpName levenshteinTo:lcSearchName s:9 k:1 c:0 i:9 d:2).
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   325
"/"/            cmpName := lcClassName copyTo:(lcSearchName size + 1 min:lcClassName size).
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   326
"/"/            dist := dist min:(cmpName levenshteinTo:lcSearchName s:9 k:1 c:0 i:9 d:2).
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   327
"/"/            dist < 4 ifTrue:[
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   328
"/"/                nearBy add:( dist -> (nsPrefix , className) ).
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   329
"/"/            ]
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   330
"/"/        ].
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   331
"/"/        matches := nearBy collect:[:eachPair | eachPair value].
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   332
"/"/    ].
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   333
"/    ].
3876
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   334
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   335
    matches isEmpty ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   336
	^ InputCompletionResult bestName:searchName matchingNames:(Array with:searchName)
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   337
    ].
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   338
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   339
    matches size == 1 ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   340
	best := matches first.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   341
	^ InputCompletionResult bestName:best matchingNames:(matches asArray)
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   342
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   343
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   344
    matches
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   345
	sort:[:name1 :name2 |
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   346
	    "name1 comes before:name2 iff"
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   347
	    ((name2 includes:$:) and:[(name1 includes:$:) not])
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   348
	    or:[ ((name1 includes:$:) == (name2 includes:$:))
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   349
		  and:[ (name1 size < name2 size)
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   350
			or: [ name1 < name2 ]]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   351
	       ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   352
	].
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   353
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   354
    isMatchString ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   355
	best := searchName.
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   356
    ] ifFalse:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   357
	matchesForLongestPrefix := matches select:[:m | m asLowercase startsWith:lcSearchName].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   358
	best := ignCaseMatches isEmpty
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   359
		    ifTrue:[ matchesForLongestPrefix longestCommonPrefix ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   360
		    ifFalse:[ matchesForLongestPrefix longestCommonPrefixCaseSensitive:false ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   361
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   362
	best size < aPartialClassName size "best size == 0" ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   363
	    best := matchedNamesWithoutPrefix longestCommonPrefix.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   364
	].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   365
	best size == 0 ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   366
	    "if tried again, return next match"
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   367
	    idx := ((matches indexOf:aPartialClassName) + 1) \\ matches size.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   368
	    idx ~~ 1 ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   369
		^ InputCompletionResult bestName:(matches at:idx) matchingNames:(matches asArray)
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   370
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   371
	].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   372
	best size < aPartialClassName size ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   373
	    best := aPartialClassName.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   374
	].
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   375
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   376
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   377
    cls := anEnvironment classNamed:best.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   378
    (cls isBehavior and:[cls isNameSpace]) ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   379
	(matches conform:[:each | each = best
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   380
				 or:[each startsWith:(best , '::')]])
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   381
	ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   382
	    best := best , '::'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   383
	].
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   384
    ].
3854
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
   385
    ^ InputCompletionResult bestName:best matchingNames:matches asArray
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   386
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   387
    "
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   388
     Smalltalk classnameCompletion:'Arr'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   389
     Smalltalk classnameCompletion:'Arra'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   390
     Smalltalk classnameCompletion:'arra'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   391
     Smalltalk classnameCompletion:'*rray'
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   392
    "
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   393
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   394
    "Created: / 10-08-2006 / 13:01:08 / cg"
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   395
!
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   396
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   397
classnameCompletion:aPartialClassName inEnvironment:anEnvironment
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   398
    "given a partial classname, return an array consisting of
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   399
     2 entries: 1st: the best (longest) match
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   400
		2nd: collection consisting of matching names"
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   401
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   402
    ^ self
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   403
	classnameCompletion:aPartialClassName
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   404
	filter:[:cls | true]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   405
	inEnvironment:anEnvironment
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   406
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   407
    "
4148
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   408
     self classnameCompletion:'Arr'   inEnvironment:Smalltalk
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   409
     self classnameCompletion:'Arra'  inEnvironment:Smalltalk
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   410
     self classnameCompletion:'arra'  inEnvironment:Smalltalk
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   411
     self classnameCompletion:'*rray' inEnvironment:Smalltalk
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   412
    "
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   413
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   414
    "Created: / 24-11-1995 / 17:24:45 / cg"
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   415
    "Modified: / 10-08-2006 / 13:01:30 / cg"
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   416
!
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   417
2977
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   418
entryCompletionBlockFor:completionSelector
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   419
    "this block can be used in a dialog to perform className completion"
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   420
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   421
    ^ [:contents :field  |
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   422
	  |s what m|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   423
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   424
	  s := contents withoutSpaces.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   425
	  field topView withCursor:(Cursor questionMark) do:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   426
	      what := self perform:completionSelector with:s with:Smalltalk.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   427
	  ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   428
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   429
	  field contents:(what first).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   430
	  (what at:2) size ~~ 1 ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   431
	      UserPreferences current beepInEditor ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   432
		field device beep
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   433
	      ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   434
	  ]
2977
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   435
      ].
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   436
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   437
    "Created: / 10-08-2006 / 13:21:37 / cg"
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   438
!
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   439
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   440
globalNameCompletion:aPartialGlobalName inEnvironment:anEnvironment
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   441
    "given a partial globalName, return an array consisting of
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   442
     2 entries: 1st: the best (longest) match
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   443
		2nd: collection consisting of matching names"
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   444
3863
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   445
    ^ self globalNameCompletion:aPartialGlobalName inEnvironment:anEnvironment match:true
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   446
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   447
    "
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   448
     Smalltalk globalnameCompletion:'Arr'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   449
     Smalltalk globalnameCompletion:'Arra'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   450
     Smalltalk globalnameCompletion:'arra'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   451
     Smalltalk globalnameCompletion:'*rray'
3863
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   452
    "
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   453
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   454
    "Created: / 10-08-2006 / 13:06:23 / cg"
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   455
!
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   456
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   457
globalNameCompletion:aPartialGlobalName inEnvironment:anEnvironment match:doMatch
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   458
    "given a partial globalName, return an array consisting of
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   459
     2 entries: 1st: the best (longest) match
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   460
		2nd: collection consisting of matching names"
3863
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   461
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   462
    |searchName matches ignCaseMatches best isMatchString|
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   463
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   464
    searchName := aPartialGlobalName.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   465
    searchName isEmpty ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   466
	^ Array with:searchName with:#()
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   467
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   468
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   469
    (searchName at:1) isLowercase ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   470
	searchName := searchName copy asUppercaseFirst
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   471
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   472
3863
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   473
    isMatchString := doMatch and:[ searchName includesMatchCharacters ].
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   474
    matches := OrderedCollection new.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   475
    ignCaseMatches := OrderedCollection new.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   476
    anEnvironment keysDo:[:aGlobalName |
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   477
	| addIt|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   478
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   479
	isMatchString ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   480
	    addIt := searchName match:aGlobalName
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   481
	] ifFalse:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   482
	    addIt := aGlobalName startsWith:searchName
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   483
	].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   484
	addIt ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   485
	    matches add:aGlobalName
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   486
	] ifFalse:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   487
	    "/ try ignoring case
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   488
	    isMatchString ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   489
		addIt := searchName match:aGlobalName caseSensitive:false
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   490
	    ] ifFalse:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   491
		addIt := aGlobalName asLowercase startsWith:searchName asLowercase
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   492
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   493
	    addIt ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   494
		ignCaseMatches add:aGlobalName
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   495
	    ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   496
	]
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   497
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   498
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   499
    matches isEmpty ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   500
	matches := ignCaseMatches
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   501
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   502
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   503
    matches isEmpty ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   504
	^ Array with:searchName with:(Array with:searchName)
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   505
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   506
    matches size == 1 ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   507
	^ Array with:matches first with:(matches asArray)
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   508
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   509
    matches := matches asSortedCollection.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   510
    isMatchString ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   511
	best := searchName.
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   512
    ] ifFalse:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   513
	best := matches longestCommonPrefix.
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   514
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   515
    ^ Array with:best with:matches asArray
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   516
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   517
    "
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   518
     Smalltalk globalnameCompletion:'Arr'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   519
     Smalltalk globalnameCompletion:'Arra'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   520
     Smalltalk globalnameCompletion:'arra'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   521
     Smalltalk globalnameCompletion:'*rray'
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   522
    "
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   523
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   524
    "Created: / 10-08-2006 / 13:06:23 / cg"
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   525
!
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   526
4051
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   527
methodProtocolCompletion:aPartialProtocolName inEnvironment:anEnvironment
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   528
    "given a partial method protocol name, return an array consisting of
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   529
     2 entries: 1st: the best (longest) match
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   530
		2nd: collection consisting of matching protocols"
4051
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   531
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   532
    |matches best lcName|
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   533
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   534
    matches := IdentitySet new.
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   535
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   536
    "/ search for exact match
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   537
    anEnvironment allMethodsWithSelectorDo:[:eachMethod :eachSelector |
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   538
	|protocol|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   539
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   540
	protocol := eachMethod category.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   541
	(protocol notNil and:[protocol startsWith:aPartialProtocolName]) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   542
	    matches add:protocol
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   543
	].
4051
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   544
    ].
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   545
    matches isEmpty ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   546
	"/ search for case-ignoring match
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   547
	lcName := aPartialProtocolName asLowercase.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   548
	anEnvironment allMethodsWithSelectorDo:[:eachMethod :eachSelector |
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   549
	    |protocol|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   550
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   551
	    protocol := eachMethod category.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   552
	    (protocol notNil and:[protocol asLowercase startsWith:lcName]) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   553
		matches add:protocol
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   554
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   555
	].
4051
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   556
    ].
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   557
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   558
    matches isEmpty ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   559
	^ Array with:aPartialProtocolName with:(Array with:aPartialProtocolName)
4051
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   560
    ].
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   561
    matches size == 1 ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   562
	^ Array with:matches first with:(matches asArray)
4051
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   563
    ].
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   564
    matches := matches asSortedCollection.
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   565
    best := matches longestCommonPrefix.
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   566
    ^ Array with:best with:matches asArray
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   567
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   568
    "
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   569
     Smalltalk methodProtocolCompletion:'doc'
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   570
     Smalltalk methodProtocolCompletion:'docu'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   571
     Smalltalk methodProtocolCompletion:'documenta'
4051
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   572
    "
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   573
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   574
    "Created: / 10-08-2006 / 13:05:27 / cg"
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   575
    "Modified: / 16-03-2011 / 12:30:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   576
!
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   577
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   578
nameSpaceCompletion:aPartialClassName inEnvironment:anEnvironment
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   579
    "given a partial name, return an array consisting of
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   580
     2 entries: 1st: the best (longest) match
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   581
		2nd: collection consisting of matching names"
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   582
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   583
    ^ self
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   584
	classnameCompletion:aPartialClassName
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   585
	filter:[:cls | cls isNameSpace]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   586
	inEnvironment:anEnvironment
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   587
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   588
    "
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   589
     DoWhatIMeanSupport nameSpaceCompletion:'To'  inEnvironment:Smalltalk
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   590
    "
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   591
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   592
    "Created: / 10-08-2006 / 13:02:16 / cg"
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   593
!
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   594
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   595
packageCompletion:aPartialPackage inEnvironment:anEnvironment
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   596
    "given a partial package name, return an array consisting of
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   597
     2 entries: 1st: the best (longest) match
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   598
		2nd: collection consisting of matching packages"
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   599
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   600
    |matches best lcName|
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   601
4195
f154f90d39a6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4194
diff changeset
   602
    matches := Smalltalk allProjectIDs
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   603
	select:[:package | package startsWith:aPartialPackage].
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   604
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   605
    matches isEmpty ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   606
	"/ search for case-ignoring match
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   607
	lcName := aPartialPackage asLowercase.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   608
	anEnvironment allClassesDo:[:aClass |
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   609
	    |package|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   610
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   611
	    package := aClass package.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   612
	    (package notNil and:[package asLowercase startsWith:lcName]) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   613
		matches add:package
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   614
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   615
	].
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   616
    ].
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   617
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   618
    matches isEmpty ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   619
	^ Array with:aPartialPackage with:(Array with:aPartialPackage)
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   620
    ].
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   621
    matches size == 1 ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   622
	^ Array with:matches first with:(matches asArray)
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   623
    ].
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   624
    matches := matches asSortedCollection.
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   625
    best := matches longestCommonPrefix.
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   626
    ^ Array with:best with:matches asArray
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   627
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   628
    "
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   629
     DoWhatIMeanSupport packageCompletion:'stx:' inEnvironment:Smalltalk
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   630
     DoWhatIMeanSupport packageCompletion:'stx:libw' inEnvironment:Smalltalk
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   631
    "
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   632
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   633
    "Created: / 10-08-2006 / 13:05:07 / cg"
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   634
!
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   635
2977
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   636
packageNameEntryCompletionBlock
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   637
    "this block can be used in a dialog to perform className completion"
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   638
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   639
    ^ self entryCompletionBlockFor:#'packageCompletion:inEnvironment:'
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   640
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   641
    "Created: / 10-08-2006 / 13:22:31 / cg"
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   642
!
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   643
4148
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   644
poolnameCompletion:aPartialClassName inEnvironment:anEnvironment
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   645
    "given a partial poolname, return an array consisting of
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   646
     2 entries: 1st: the best (longest) match
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   647
		2nd: collection consisting of matching names"
4148
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   648
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   649
    ^ self
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   650
	classnameCompletion:aPartialClassName
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   651
	filter:[:cls | cls isSharedPool]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   652
	inEnvironment:anEnvironment
4148
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   653
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   654
    "
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   655
     self poolnameCompletion:'Win' inEnvironment:Smalltalk
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   656
     self poolnameCompletion:'Z'   inEnvironment:Smalltalk
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   657
     self poolnameCompletion:'a'   inEnvironment:Smalltalk
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   658
    "
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   659
!
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   660
4049
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   661
resourceCompletion:aPartialResourceName inEnvironment:anEnvironment match:doMatch ignoreCase:ignoreCase
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   662
    "given a partial resource name, return an array consisting of
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   663
     2 entries: 1st: the longest match
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   664
		2nd: collection consisting of matching defined resources"
4049
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   665
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   666
    |matches best lcSym isMatch|
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   667
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   668
    matches := IdentitySet new.
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   669
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   670
    isMatch := doMatch and:[aPartialResourceName includesMatchCharacters].
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   671
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   672
    anEnvironment allMethodsWithSelectorDo:[:eachMethod :eachSelector |
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   673
	eachMethod hasResource ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   674
	    eachMethod resources keysDo:[:eachResourceName |
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   675
		(isMatch
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   676
		    ifTrue:[ (aPartialResourceName match:eachResourceName caseSensitive:ignoreCase not) ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   677
		    ifFalse:[ ignoreCase
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   678
				ifTrue:[ (eachResourceName asLowercase startsWith:aPartialResourceName asLowercase) ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   679
				ifFalse:[ (eachResourceName startsWith:aPartialResourceName) ] ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   680
		) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   681
		    matches add:eachResourceName
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   682
		].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   683
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   684
	].
4049
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   685
    ].
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   686
    (matches isEmpty and:[ignoreCase not]) ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   687
	"/ search for case-ignoring match
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   688
	lcSym := aPartialResourceName asLowercase.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   689
	anEnvironment allMethodsWithSelectorDo:[:eachMethod :eachSelector |
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   690
	    eachMethod hasResource ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   691
		eachMethod resources keysDo:[:eachResourceName |
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   692
		    (isMatch
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   693
			ifTrue:[ (aPartialResourceName match:eachResourceName caseSensitive:false) ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   694
			ifFalse:[ (eachResourceName asLowercase startsWith:lcSym) ])
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   695
		     ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   696
			matches add:eachResourceName
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   697
		    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   698
		].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   699
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   700
	].
4049
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   701
    ].
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   702
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   703
    matches isEmpty ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   704
	^ Array with:aPartialResourceName with:#()
4049
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   705
    ].
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   706
    matches size == 1 ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   707
	^ Array with:matches first with:(matches asArray)
4049
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   708
    ].
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   709
    matches := matches asSortedCollection.
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   710
    best := matches longestCommonPrefix.
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   711
    ^ Array with:best with:matches asArray
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   712
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   713
    "
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   714
     DoWhatIMeanSupport resourceCompletion:'*debug*' inEnvironment:Smalltalk match:true ignoreCase:false
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   715
     DoWhatIMeanSupport resourceCompletion:'context' inEnvironment:Smalltalk match:true ignoreCase:false
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   716
     DoWhatIMeanSupport resourceCompletion:'key' inEnvironment:Smalltalk match:true ignoreCase:false
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   717
     DoWhatIMeanSupport resourceCompletion:'cont' inEnvironment:Smalltalk match:true ignoreCase:false
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   718
    "
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   719
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   720
    "Created: / 06-07-2011 / 12:04:41 / cg"
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   721
!
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   722
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   723
selectorCompletion:aPartialSymbolName inEnvironment:anEnvironment
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   724
    "given a partial selector, return an array consisting of
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   725
     2 entries: 1st: the longest match
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   726
		2nd: collection consisting of matching implemented selectors"
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   727
3863
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   728
    ^ self selectorCompletion:aPartialSymbolName inEnvironment:anEnvironment match:false
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   729
!
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   730
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   731
selectorCompletion:aPartialSymbolName inEnvironment:anEnvironment match:doMatch
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   732
    "given a partial selector, return an array consisting of
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   733
     2 entries: 1st: the longest match
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   734
		2nd: collection consisting of matching implemented selectors"
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   735
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   736
    ^ self
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   737
	selectorCompletion:aPartialSymbolName
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   738
	inEnvironment:anEnvironment
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   739
	match:doMatch
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   740
	ignoreCase:false
3955
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   741
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   742
    "
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   743
     DoWhatIMeanSupport selectorCompletion:'inst*p' inEnvironment:Smalltalk match:true
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   744
     DoWhatIMeanSupport selectorCompletion:'inst*pl' inEnvironment:Smalltalk match:true
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   745
     DoWhatIMeanSupport selectorCompletion:'at:p' inEnvironment:Smalltalk match:true
3955
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   746
     DoWhatIMeanSupport selectorCompletion:'nextP' inEnvironment:Smalltalk match:true
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   747
     DoWhatIMeanSupport selectorCompletion:'nextp' inEnvironment:Smalltalk match:true
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   748
    "
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   749
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   750
    "Modified: / 07-06-1996 / 08:44:33 / stefan"
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   751
    "Modified: / 26-10-2010 / 20:30:27 / cg"
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   752
!
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   753
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   754
selectorCompletion:aPartialSymbolName inEnvironment:anEnvironment match:doMatch ignoreCase:ignoreCase
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   755
    "given a partial selector, return an array consisting of
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   756
     2 entries: 1st: the longest match
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   757
		2nd: collection consisting of matching implemented selectors"
3955
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   758
3863
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   759
    |matches best lcSym isMatch|
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   760
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   761
    matches := IdentitySet new.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   762
3863
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   763
    isMatch := doMatch and:[aPartialSymbolName includesMatchCharacters].
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   764
3751
eafbe64ab0fc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3734
diff changeset
   765
    anEnvironment allMethodsWithSelectorDo:[:eachMethod :eachSelector |
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   766
	(isMatch
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   767
	    ifTrue:[ (aPartialSymbolName match:eachSelector caseSensitive:ignoreCase not) ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   768
	    ifFalse:[ ignoreCase
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   769
			ifTrue:[ (eachSelector asLowercase startsWith:aPartialSymbolName asLowercase) ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   770
			ifFalse:[ (eachSelector startsWith:aPartialSymbolName) ] ])
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   771
	 ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   772
	    matches add:eachSelector
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   773
	].
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   774
    ].
3955
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   775
    (matches isEmpty and:[ignoreCase not]) ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   776
	"/ search for case-ignoring match
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   777
	lcSym := aPartialSymbolName asLowercase.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   778
	anEnvironment allMethodsWithSelectorDo:[:eachMethod :eachSelector |
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   779
	    (isMatch
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   780
		ifTrue:[ (aPartialSymbolName match:eachSelector caseSensitive:false) ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   781
		ifFalse:[ (eachSelector asLowercase startsWith:lcSym) ])
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   782
	     ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   783
		matches add:eachSelector
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   784
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   785
	].
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   786
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   787
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   788
    matches isEmpty ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   789
	^ Array with:aPartialSymbolName with:#() "/ (Array with:aPartialSymbolName)
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   790
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   791
    matches size == 1 ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   792
	^ Array with:matches first with:(matches asArray)
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   793
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   794
    matches := matches asSortedCollection.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   795
    best := matches longestCommonPrefix.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   796
    ^ Array with:best with:matches asArray
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   797
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   798
    "
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   799
     DoWhatIMeanSupport selectorCompletion:'inst*p' inEnvironment:Smalltalk match:true
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   800
     DoWhatIMeanSupport selectorCompletion:'inst*pl' inEnvironment:Smalltalk match:true
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   801
     DoWhatIMeanSupport selectorCompletion:'at:p' inEnvironment:Smalltalk match:true
3867
03f7ad841731 changed: #selectorCompletion:inEnvironment:match:
Claus Gittinger <cg@exept.de>
parents: 3864
diff changeset
   802
     DoWhatIMeanSupport selectorCompletion:'nextP' inEnvironment:Smalltalk match:true
03f7ad841731 changed: #selectorCompletion:inEnvironment:match:
Claus Gittinger <cg@exept.de>
parents: 3864
diff changeset
   803
     DoWhatIMeanSupport selectorCompletion:'nextp' inEnvironment:Smalltalk match:true
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   804
    "
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   805
3955
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   806
    "Modified: / 07-06-1996 / 08:44:33 / stefan"
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   807
    "Created: / 26-10-2010 / 20:30:06 / cg"
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   808
! !
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   809
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   810
!DoWhatIMeanSupport class methodsFor:'rename support'!
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   811
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   812
goodRenameDefaultFor:oldName lastOld:lastOldName lastNew:lastNewName
2513
de7a2f5335c2 comments
Claus Gittinger <cg@exept.de>
parents: 2468
diff changeset
   813
    "generate a reasonable default for a rename operation.
de7a2f5335c2 comments
Claus Gittinger <cg@exept.de>
parents: 2468
diff changeset
   814
     (used for rename category etc.)"
2468
beeedb5f57f4 comment
Claus Gittinger <cg@exept.de>
parents: 2434
diff changeset
   815
4065
ebea28fa8bab changed: #goodRenameDefaultFor:lastOld:lastNew:
Claus Gittinger <cg@exept.de>
parents: 4058
diff changeset
   816
    |prefix suffix lastNewSize lastOldSize left right inserted deleted tryAgain|
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   817
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   818
    lastNewName isNil ifTrue:[ ^ nil].
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   819
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   820
    lastNewSize := lastNewName size.
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   821
    lastOldSize := lastOldName size.
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   822
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   823
    (lastNewName endsWith:lastOldName) ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   824
	"last rename was
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   825
	    'foo' -> 'Xfoo'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   826
	 then, a good default for
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   827
	    'bar' would be 'Xbar'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   828
	"
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   829
	prefix := lastNewName copyTo:(lastNewSize - lastOldSize).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   830
	^ (prefix , oldName).
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   831
    ].
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   832
    (lastOldName endsWith:lastNewName) ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   833
	"last rename was
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   834
	    'Xfoo' -> 'foo'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   835
	 then, a good default for
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   836
	    'Xbar' would be 'bar'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   837
	"
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   838
	prefix := lastOldName copyTo:(lastOldSize - lastNewSize).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   839
	(oldName startsWith:prefix) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   840
	    ^ (oldName copyFrom:prefix size+1).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   841
	]
2514
4f8d8658289a comments
Claus Gittinger <cg@exept.de>
parents: 2513
diff changeset
   842
    ].
4f8d8658289a comments
Claus Gittinger <cg@exept.de>
parents: 2513
diff changeset
   843
    (lastOldName asLowercase = lastNewName asLowercase) ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   844
	(lastOldName first ~= lastNewName first) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   845
	    (lastOldName first isLowercase = oldName first isLowercase) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   846
		"last rename was
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   847
		    'xfoo' -> 'Xfoo'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   848
		 then, a good default for
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   849
		    'xbar' would be 'Xbar'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   850
		"
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   851
		lastOldName first isLowercase ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   852
		    ^ oldName asUppercaseFirst "oldName first asUppercase asString , (oldName copyFrom:2)".
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   853
		] ifFalse:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   854
		    ^ oldName asLowercaseFirst "oldName first asLowercase asString , (oldName copyFrom:2)".
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   855
		]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   856
	    ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   857
	].
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   858
    ].
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   859
    (lastOldName withoutSeparators = lastNewName) ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   860
	"last rename was
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   861
	    '  foo   ' -> 'foo'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   862
	 then, a good default for
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   863
	    '  bar   ' would be 'bar'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   864
	"
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   865
	^ oldName withoutSeparators.
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   866
    ].
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   867
    (lastNewName startsWith:lastOldName) ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   868
	"last rename was
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   869
	    'foo' -> 'fooX'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   870
	 then, a good default for
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   871
	    'bar' would be 'barX'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   872
	"
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   873
	suffix := lastNewName copyLast:(lastNewSize - lastOldSize).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   874
	^ (oldName , suffix).
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   875
    ].
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   876
    (lastOldName startsWith:lastNewName) ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   877
	"last rename was
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   878
	    'fooX' -> 'foo'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   879
	 then, a good default for
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   880
	    'barX' would be 'bar'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   881
	"
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   882
	suffix := lastOldName copyLast:(lastOldSize - lastNewSize).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   883
	(oldName endsWith:suffix) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   884
	    ^ (oldName copyButLast:suffix size).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   885
	]
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   886
    ].
2558
81ef3253fd23 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2557
diff changeset
   887
2557
b1d8a61319d9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2553
diff changeset
   888
    prefix := lastOldName commonPrefixWith:lastNewName.
b1d8a61319d9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2553
diff changeset
   889
    suffix := lastOldName commonSuffixWith:lastNewName.
2559
f9f489baf23f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2558
diff changeset
   890
2558
81ef3253fd23 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2557
diff changeset
   891
    (prefix size > 0) ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   892
	(suffix size > 0) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   893
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   894
	    prefix := prefix copyTo:(((lastNewName size - suffix size) min:(lastOldName size - suffix size)) min:prefix size).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   895
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   896
	    "last rename was
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   897
		'fooR' -> 'fooXR'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   898
	     then, a good default for
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   899
		'barR' would be 'barXR'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   900
	    "
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   901
	    left := lastOldName copyTo:prefix size.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   902
	    right := lastOldName copyLast:suffix size.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   903
	    lastNewSize > lastOldSize ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   904
		inserted := (lastNewName copyFrom:(left size + 1)) copyButLast:(right size).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   905
		inserted size > 0 ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   906
		    (oldName startsWith:prefix) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   907
			^ oldName copyWithAll:inserted insertedAfterIndex:prefix size
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   908
		    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   909
		].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   910
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   911
	    (oldName string endsWith:suffix string) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   912
		deleted := (lastOldName string copyFrom:(prefix size + 1)) copyButLast:(suffix size).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   913
		(oldName size-suffix size-deleted size + 1) >= 1 ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   914
		    ((oldName copyFrom:oldName size-suffix size-deleted size + 1) copyTo:deleted size) = deleted ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   915
			"last rename was
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   916
			    'fooXR' -> 'fooR'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   917
			 then, a good default for
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   918
			    'barXS' would be 'barS'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   919
			"
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   920
			^ (oldName copyTo:oldName size-suffix size-deleted size) , suffix
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   921
		    ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   922
		]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   923
	    ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   924
	].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   925
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   926
	(oldName endsWith:(lastOldName copyFrom:prefix size+1)) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   927
	    "last rename was
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   928
		'fooX' -> 'fooY'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   929
	     then, a good default for
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   930
		'barX' would be 'barY'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   931
	    "
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   932
	    left := oldName copyButLast:(lastOldName copyFrom:prefix size+1) size.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   933
	    right := lastNewName copyFrom:prefix size+1.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   934
	    ^ left , right
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   935
	]
2557
b1d8a61319d9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2553
diff changeset
   936
    ].
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   937
4065
ebea28fa8bab changed: #goodRenameDefaultFor:lastOld:lastNew:
Claus Gittinger <cg@exept.de>
parents: 4058
diff changeset
   938
    suffix size > 0 ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   939
	|prefix2|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   940
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   941
	"last rename was:
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   942
	    'fooSUFF1' -> 'barSUFF1'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   943
	 then, a good default for
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   944
	    'fooSUFF2' -> 'barSUFF2'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   945
	"
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   946
	prefix := lastOldName copyTo:(lastOldName size - suffix size).  "/ the foo
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   947
	(oldName startsWith:prefix) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   948
	    prefix2 := lastNewName copyTo:(lastNewName size - suffix size). "/ the bar
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   949
	    ^ prefix2,(oldName copyFrom:(prefix size+1)).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   950
	].
4065
ebea28fa8bab changed: #goodRenameDefaultFor:lastOld:lastNew:
Claus Gittinger <cg@exept.de>
parents: 4058
diff changeset
   951
    ].
ebea28fa8bab changed: #goodRenameDefaultFor:lastOld:lastNew:
Claus Gittinger <cg@exept.de>
parents: 4058
diff changeset
   952
ebea28fa8bab changed: #goodRenameDefaultFor:lastOld:lastNew:
Claus Gittinger <cg@exept.de>
parents: 4058
diff changeset
   953
    "/ was there something stripped at the end?
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   954
    suffix := oldName commonSuffixWith:lastOldName.
4065
ebea28fa8bab changed: #goodRenameDefaultFor:lastOld:lastNew:
Claus Gittinger <cg@exept.de>
parents: 4058
diff changeset
   955
    [suffix size > 0] whileTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   956
	tryAgain := self
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   957
		    goodRenameDefaultFor:(oldName copyButLast:suffix size)
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   958
		    lastOld:(lastOldName copyButLast:suffix size)
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   959
		    lastNew:lastNewName.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   960
	tryAgain notNil ifTrue:[^ tryAgain].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   961
	suffix := suffix copyFrom:2.
4065
ebea28fa8bab changed: #goodRenameDefaultFor:lastOld:lastNew:
Claus Gittinger <cg@exept.de>
parents: 4058
diff changeset
   962
    ].
2382
d89d86edaae4 separated default for arbitrary renames and deault for files.
Claus Gittinger <cg@exept.de>
parents: 2376
diff changeset
   963
    ^ nil
2557
b1d8a61319d9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2553
diff changeset
   964
b1d8a61319d9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2553
diff changeset
   965
    "
2558
81ef3253fd23 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2557
diff changeset
   966
     self goodRenameDefaultFor:'bar' lastOld:'foo' lastNew:'fooXX'
81ef3253fd23 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2557
diff changeset
   967
     self goodRenameDefaultFor:'bar' lastOld:'foo' lastNew:'XXfoo'
81ef3253fd23 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2557
diff changeset
   968
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   969
     self goodRenameDefaultFor:'barXX' lastOld:'fooXX' lastNew:'foo'
2558
81ef3253fd23 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2557
diff changeset
   970
     self goodRenameDefaultFor:'XXbar' lastOld:'XXfoo' lastNew:'foo'
81ef3253fd23 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2557
diff changeset
   971
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   972
     self goodRenameDefaultFor:'barXX' lastOld:'fooXX' lastNew:'fooYY'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   973
     self goodRenameDefaultFor:'XXbar' lastOld:'XXfoo' lastNew:'foo'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   974
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   975
     self goodRenameDefaultFor:'bar2' lastOld:'foo1' lastNew:'foo01'
2559
f9f489baf23f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2558
diff changeset
   976
     self goodRenameDefaultFor:'barXY' lastOld:'fooXY' lastNew:'fooY'
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   977
     self goodRenameDefaultFor:'bar' lastOld:'foo' lastNew:'fXoo'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   978
     self goodRenameDefaultFor:'bar' lastOld:'foo' lastNew:'fXXXoo'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   979
     self goodRenameDefaultFor:'bar' lastOld:'foo' lastNew:'foXXXo'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   980
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   981
     self goodRenameDefaultFor:'bar001' lastOld:'foo001' lastNew:'foo002_001'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   982
     self goodRenameDefaultFor:'CoastCore-CSFoo' lastOld:'CoastCore-CSBar' lastNew:'Coast-Core-CSBar'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   983
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   984
     self goodRenameDefaultFor:'mti.odt2.level1HeadlineStyle'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   985
		       lastOld:'mti.odt2.level1HeadlineMatchPattern'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   986
		       lastNew:'Key_odt2_level1HeadlineMatchPattern'
2557
b1d8a61319d9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2553
diff changeset
   987
    "
4065
ebea28fa8bab changed: #goodRenameDefaultFor:lastOld:lastNew:
Claus Gittinger <cg@exept.de>
parents: 4058
diff changeset
   988
ebea28fa8bab changed: #goodRenameDefaultFor:lastOld:lastNew:
Claus Gittinger <cg@exept.de>
parents: 4058
diff changeset
   989
    "Modified: / 24-07-2011 / 11:06:03 / cg"
2382
d89d86edaae4 separated default for arbitrary renames and deault for files.
Claus Gittinger <cg@exept.de>
parents: 2376
diff changeset
   990
!
d89d86edaae4 separated default for arbitrary renames and deault for files.
Claus Gittinger <cg@exept.de>
parents: 2376
diff changeset
   991
d89d86edaae4 separated default for arbitrary renames and deault for files.
Claus Gittinger <cg@exept.de>
parents: 2376
diff changeset
   992
goodRenameDefaultForFile:oldName lastOld:lastOldName lastNew:lastNewName
2513
de7a2f5335c2 comments
Claus Gittinger <cg@exept.de>
parents: 2468
diff changeset
   993
    "generate a reasonable default for a file rename operation.
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   994
     (Try to rename multiple files in the new fileBrowser,
2513
de7a2f5335c2 comments
Claus Gittinger <cg@exept.de>
parents: 2468
diff changeset
   995
     to see what this is doing)"
2468
beeedb5f57f4 comment
Claus Gittinger <cg@exept.de>
parents: 2434
diff changeset
   996
2382
d89d86edaae4 separated default for arbitrary renames and deault for files.
Claus Gittinger <cg@exept.de>
parents: 2376
diff changeset
   997
    |prefix suffix t
d89d86edaae4 separated default for arbitrary renames and deault for files.
Claus Gittinger <cg@exept.de>
parents: 2376
diff changeset
   998
     lastOldWOSuffix lastNewWOSuffix oldWOSuffix lastOldRest oldRest lastNewRest
d89d86edaae4 separated default for arbitrary renames and deault for files.
Claus Gittinger <cg@exept.de>
parents: 2376
diff changeset
   999
     lastRemoved lastInserted default|
d89d86edaae4 separated default for arbitrary renames and deault for files.
Claus Gittinger <cg@exept.de>
parents: 2376
diff changeset
  1000
d89d86edaae4 separated default for arbitrary renames and deault for files.
Claus Gittinger <cg@exept.de>
parents: 2376
diff changeset
  1001
    default := self goodRenameDefaultFor:oldName lastOld:lastOldName lastNew:lastNewName.
d89d86edaae4 separated default for arbitrary renames and deault for files.
Claus Gittinger <cg@exept.de>
parents: 2376
diff changeset
  1002
    default notNil ifTrue:[ ^ default].
d89d86edaae4 separated default for arbitrary renames and deault for files.
Claus Gittinger <cg@exept.de>
parents: 2376
diff changeset
  1003
3135
7ad9ff29225e changed #classCategoryLoadFromRepository
Claus Gittinger <cg@exept.de>
parents: 2977
diff changeset
  1004
    lastOldWOSuffix := lastOldName asFilename nameWithoutSuffix.
7ad9ff29225e changed #classCategoryLoadFromRepository
Claus Gittinger <cg@exept.de>
parents: 2977
diff changeset
  1005
    lastNewWOSuffix := lastNewName asFilename nameWithoutSuffix.
7ad9ff29225e changed #classCategoryLoadFromRepository
Claus Gittinger <cg@exept.de>
parents: 2977
diff changeset
  1006
    oldWOSuffix := oldName asFilename nameWithoutSuffix.
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1007
2434
e7758915432e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2382
diff changeset
  1008
    "/ suffix change ?
e7758915432e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2382
diff changeset
  1009
    lastOldWOSuffix = lastNewWOSuffix ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1010
	lastOldName asFilename suffix ~= lastNewName asFilename suffix ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1011
	    ^ (oldName asFilename withSuffix:(lastNewName asFilename suffix)) pathName
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1012
	].
2434
e7758915432e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2382
diff changeset
  1013
    ].
e7758915432e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2382
diff changeset
  1014
2553
9925f0aca022 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2517
diff changeset
  1015
    default := self goodRenameDefaultFor:oldWOSuffix lastOld:lastOldWOSuffix lastNew:lastNewWOSuffix.
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1016
    default notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1017
	lastOldRest := lastOldName copyFrom:lastOldWOSuffix size + 1.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1018
	lastNewRest := lastNewName copyFrom:lastNewWOSuffix size + 1.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1019
	oldRest := oldName copyFrom:oldWOSuffix size + 1.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1020
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1021
	^ default , lastNewRest
2553
9925f0aca022 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2517
diff changeset
  1022
    ].
9925f0aca022 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2517
diff changeset
  1023
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1024
    prefix := lastOldWOSuffix commonPrefixWith:oldWOSuffix.
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1025
    (lastNewWOSuffix startsWith:prefix) ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1026
	lastOldRest := lastOldWOSuffix copyFrom:prefix size + 1.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1027
	lastNewRest := lastNewWOSuffix copyFrom:prefix size + 1.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1028
	oldRest := oldWOSuffix copyFrom:prefix size + 1.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1029
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1030
	(lastNewRest endsWith:lastOldRest) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1031
	    t := lastNewRest copyButLast:lastOldRest size.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1032
	    ^ ((prefix , t , oldRest) asFilename withSuffix:oldName asFilename suffix) name
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1033
	].
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1034
    ].
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1035
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1036
    suffix := lastOldWOSuffix commonSuffixWith:lastNewWOSuffix.
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1037
    suffix size > 0 ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1038
	"/ last change changed something at the beginning
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1039
	prefix := oldWOSuffix commonPrefixWith:lastOldWOSuffix.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1040
	prefix size > 0 ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1041
	    "/ this name starts with the same characters
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1042
	    lastRemoved := lastOldWOSuffix copyButLast:suffix size.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1043
	    lastInserted := lastNewWOSuffix copyButLast:suffix size.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1044
	    (lastRemoved startsWith:lastInserted) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1045
		oldWOSuffix size >= lastInserted size ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1046
		    ^ (oldWOSuffix copyTo:lastInserted size) , (oldName copyFrom:lastRemoved size + 1)
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1047
		]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1048
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1049
	    ^ lastInserted , (oldName copyFrom:lastRemoved size + 1)
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1050
	].
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1051
    ].
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1052
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1053
    ^ nil
3135
7ad9ff29225e changed #classCategoryLoadFromRepository
Claus Gittinger <cg@exept.de>
parents: 2977
diff changeset
  1054
7ad9ff29225e changed #classCategoryLoadFromRepository
Claus Gittinger <cg@exept.de>
parents: 2977
diff changeset
  1055
    "Modified: / 07-11-2006 / 13:58:39 / cg"
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1056
! !
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1057
2515
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1058
!DoWhatIMeanSupport class methodsFor:'typing distance'!
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1059
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1060
isKey:k1 nextTo:k2
2774
82e1d84243f4 comment
Stefan Vogel <sv@exept.de>
parents: 2667
diff changeset
  1061
    "return true, if k1 and k2 are adjacent keys on the keyboard.
3299
1cd4b22434a6 code completion stuff moved to here (for reuse)
Claus Gittinger <cg@exept.de>
parents: 3198
diff changeset
  1062
     This is used to specially priorize plausible typing errors of adjacent keys.
4386
d5b6d7c0b6ee class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4385
diff changeset
  1063
     CAVEAT: hard coded us-, german and french keyboards here; data should come from somewhere else."
2515
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1064
3316
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1065
    ^ self isKey:k1 nextTo:k2 onKeyboard:(self keyboard)
2515
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1066
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1067
    "
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1068
     self isKey:$a nextTo:$a
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1069
     self isKey:$a nextTo:$s
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1070
     self isKey:$a nextTo:$q
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1071
     self isKey:$a nextTo:$w
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1072
     self isKey:$a nextTo:$z
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1073
     self isKey:$a nextTo:$x
2515
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1074
    "
3316
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1075
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1076
    "Modified: / 16-01-2008 / 17:17:31 / cg"
2515
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1077
!
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1078
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1079
isKey:k1 nextTo:k2 onKeyboard:keys
2774
82e1d84243f4 comment
Stefan Vogel <sv@exept.de>
parents: 2667
diff changeset
  1080
    "return true, if k1 and k2 are adjacent keys on the keyboard defined by keys"
2515
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1081
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1082
    |row1 row2 col1 col2|
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1083
2774
82e1d84243f4 comment
Stefan Vogel <sv@exept.de>
parents: 2667
diff changeset
  1084
    row1 := keys findFirst:[:eachRow | col1 := eachRow indexOf:k1. col1 ~~ 0].
2517
a5323c17b767 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2516
diff changeset
  1085
    row1 == 0 ifTrue:[^ false].
2774
82e1d84243f4 comment
Stefan Vogel <sv@exept.de>
parents: 2667
diff changeset
  1086
    row2 := keys findFirst:[:eachRow | col2 := eachRow indexOf:k2. col2 ~~ 0].
2517
a5323c17b767 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2516
diff changeset
  1087
    row2 == 0 ifTrue:[^ false].
2515
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1088
2774
82e1d84243f4 comment
Stefan Vogel <sv@exept.de>
parents: 2667
diff changeset
  1089
    ^ (row1-row2) abs <= 1 and:[(col1-col2) abs <= 1]
2515
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1090
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1091
    "
2774
82e1d84243f4 comment
Stefan Vogel <sv@exept.de>
parents: 2667
diff changeset
  1092
     self isKey:$a nextTo:$q
2517
a5323c17b767 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2516
diff changeset
  1093
     self isKey:$a nextTo:$x
2515
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1094
    "
3316
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1095
!
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1096
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1097
keyboard
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1098
    "the keyboard layout
4386
d5b6d7c0b6ee class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4385
diff changeset
  1099
     (useful to figure out which keys are nearby a key, to find possible typing errors)
d5b6d7c0b6ee class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4385
diff changeset
  1100
     CAVEAT: hard coded us-, german and french keyboards here; data should come from somewhere else."
3316
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1101
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1102
    |lang|
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1103
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1104
    lang := UserPreferences current language.
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1105
    lang == #de ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1106
	^ #(
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1107
	       '1234567890-'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1108
	       '*qwertzuiop'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1109
	       '**asdfghjkl:'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1110
	       '***yxcvbnm'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1111
	).
3316
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1112
    ].
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1113
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1114
    lang == #fr ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1115
	^ #(
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1116
	       '1234567890'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1117
	       '*azertyuiop'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1118
	       '**qsdfghjklm'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1119
	       '***wxcvbn,'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1120
	).
3316
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1121
    ].
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1122
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1123
    ^ #(
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1124
	   '1234567890-'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1125
	   '*qwertyuiop'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1126
	   '**asdfghjkl:'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1127
	   '***zxcvbnm'
4386
d5b6d7c0b6ee class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4385
diff changeset
  1128
    ).
3316
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1129
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1130
    "
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1131
     self keyboard
3316
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1132
    "
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1133
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1134
    "Created: / 16-01-2008 / 17:17:13 / cg"
2515
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1135
! !
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1136
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1137
!DoWhatIMeanSupport methodsFor:'code completion'!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1138
4426
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1139
codeCompletionFor: codeAspectArg language: languageOrNilArg method:methodOrNilArg orClass:classOrNilArg context:contextOrNilArg codeView:codeViewArg into:actionBlock
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1140
    "provide code completion information by analyzing what the editing state is in codeViewArg
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1141
     (cursor position, characters around cursor etc.) and calling back into actionBlock, passing
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1142
     the info as argument. 
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1143
     The interface has been defined in that way 
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1144
     (and tight coupling with internals of the editor) because
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1145
        1) the completer needs to know about the text around the cursor position
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1146
        2) the edit operation for completion may be non-trivial
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1147
           (although not yet fully implemented, non-local rewrite procedures may and will be added in the future
4426
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1148
     For example, in many situations, both a completion of a unary selector before the cursor,
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1149
     or adding another keyword part after the cursor is possible.
4426
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1150
     Thus, this provides a list of completions PLUS a list of edit operations (as per completion), to
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1151
     perform the completion.
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1152
     The caller has to open a dialog, providing the suggestions, and perform the corresponding edit operation.
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1153
     An additional array containing a textual description for each suggestion is also provided, which could
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1154
     be shown as info or appended to the suggestions (such as 'complete variable', 'complete keyword', etc.
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1155
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1156
     ContextOrNil is the current context, if this is called from the debugger;
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1157
     or nil, if called from the browser.
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1158
     If nonNil, we can make better guesses, because we actually know what a variable's type is"
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1159
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1160
    | language |
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1161
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1162
    codeAspect := codeAspectArg.
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1163
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1164
    languageOrNilArg notNil ifTrue:[
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1165
        language := languageOrNilArg
4426
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1166
    ] ifFalse:[
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1167
        contextOrNilArg notNil ifTrue:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1168
            | method |
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1169
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1170
            method := contextOrNilArg method.
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1171
            method notNil ifTrue:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1172
                language := method programmingLanguage
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1173
            ] ifFalse:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1174
                contextOrNilArg isJavaContext ifTrue:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1175
                    language := JavaLanguage instance
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1176
                ] ifFalse:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1177
                    language := SmalltalkLanguage instance.
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1178
                ].
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1179
            ].
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1180
        ] ifFalse:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1181
            methodOrNilArg notNil ifTrue:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1182
                language := methodOrNilArg programmingLanguage
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1183
            ] ifFalse:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1184
                classOrNilArg notNil ifTrue:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1185
                    language := classOrNilArg programmingLanguage
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1186
                ]
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1187
            ]
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1188
        ].
4426
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1189
    ].
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1190
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1191
    language notNil ifTrue:[
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1192
        language isSmalltalk ifTrue:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1193
            ^self codeCompletionForSmalltalkMethod: methodOrNilArg orClass: classOrNilArg context: contextOrNilArg codeView: codeViewArg into: actionBlock
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1194
        ].
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1195
        language isSTXJavaScript ifTrue:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1196
            ^self codeCompletionForJavascriptMethod: methodOrNilArg orClass: classOrNilArg context: contextOrNilArg codeView: codeViewArg into: actionBlock
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1197
        ].
4426
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1198
    ].
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1199
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1200
    "/ No completion support for given language
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1201
    self breakPoint: #cg.
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1202
    self breakPoint: #jv.
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1203
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1204
    "Created: / 27-09-2013 / 10:21:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
4451
8db9cfa578c0 class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4444
diff changeset
  1205
    "Modified: / 26-11-2013 / 23:43:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
4426
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1206
!
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1207
4392
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1208
codeCompletionForLanguage: languageOrNil class: classOrNilArg context:contextOrNilArg codeView:codeViewArg
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1209
    "OBSOLETE; migrating to use the the new 'xxx: into:' protocol.
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1210
     contextOrNil is the current context, if this is called from the debugger;
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1211
     nil, if called from the browser.
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1212
     If nonNil, we can make better guesses, 
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1213
     because we actually know what a variable's type is."
4392
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1214
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1215
    | language |
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1216
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1217
    languageOrNil notNil ifTrue:[
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1218
        language := languageOrNil
4392
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1219
    ] ifFalse:[
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1220
        contextOrNilArg notNil ifTrue:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1221
            language := contextOrNilArg method programmingLanguage.
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1222
        ] ifFalse:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1223
            classOrNilArg notNil ifTrue:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1224
                language := classOrNilArg programmingLanguage.
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1225
            ]
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1226
        ].
4392
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1227
    ].
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1228
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1229
    language notNil ifTrue:[
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1230
        language isSmalltalk ifTrue:[
4731
145b177a3203 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4727
diff changeset
  1231
            classOrNil := classOrNilArg.
145b177a3203 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4727
diff changeset
  1232
            contextOrNil := contextOrNilArg.
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1233
            ^self codeCompletionForSmalltalkClass: classOrNil context: contextOrNil codeView: codeViewArg
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1234
        ].
4392
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1235
    ].
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1236
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1237
    "/ No completion support for given language
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1238
    self breakPoint: #cg.
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1239
    self breakPoint: #jv.
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1240
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1241
    "Created: / 18-09-2013 / 13:49:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1242
! !
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1243
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1244
!DoWhatIMeanSupport methodsFor:'code completion - JavaScript'!
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1245
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1246
codeCompletionForJavascriptMethod:methodOrNilArg orClass:classOrNilArg context:contextOrNilArg codeView:codeViewArg into:actionBlock
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1247
    "provide code completion information by analyzing what the editing state is in codeViewArg
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1248
     (cursor position, characters around cursor etc.) and calling back into actionBlock, passing
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1249
     the info as argument. 
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1250
     The interface has been defined in that way 
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1251
     (and tight coupling with internals of the editor) because
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1252
        1) the completer needs to know about the text around the cursor position
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1253
        2) the edit operation for completion may be non-trivial
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1254
           (although not yet fully implemented, non-local rewrite procedures may and will be added in the future
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1255
     For example, in many situations, both a completion of a unary selector before the cursor,
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1256
     or adding another keyword part after the cursor is possible.
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1257
     Thus, this provides a list of completions PLUS a list of edit operations (as per completion), to
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1258
     perform the completion.
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1259
     The caller has to open a dialog, providing the suggestions, and perform the corresponding edit operation.
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1260
     An additional array containing a textual description for each suggestion is also provided, which could
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1261
     be shown as info or appended to the suggestions (such as 'complete variable', 'complete keyword', etc.
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1262
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1263
     ContextOrNil is the current context, if this is called from the debugger;
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1264
     or nil, if called from the browser.
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1265
     If nonNil, we can make better guesses, because we actually know what a variable's type is"
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1266
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1267
    languageOrNil := STXJavaScriptLanguage instance.
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1268
    methodOrNil := methodOrNilArg.
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1269
    classOrNil := classOrNilArg.
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1270
    codeView := codeViewArg.
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1271
    contextOrNil := contextOrNilArg.
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1272
4423
c21baefab5d0 Call to JavaScriptCompletionEngine when completing for JS
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4422
diff changeset
  1273
    JavaScriptCompletionEngine notNil ifTrue:[
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1274
        JavaScriptCompletionEngine new
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1275
           completeForMethod: methodOrNil class: classOrNil context: contextOrNil codeView: codeView into: actionBlock.
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1276
    ].
4423
c21baefab5d0 Call to JavaScriptCompletionEngine when completing for JS
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4422
diff changeset
  1277
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1278
    self information:'Not yet supported'.
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1279
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1280
    "Created: / 18-09-2013 / 16:24:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
4423
c21baefab5d0 Call to JavaScriptCompletionEngine when completing for JS
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4422
diff changeset
  1281
    "Modified: / 25-09-2013 / 15:13:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1282
! !
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1283
4392
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1284
!DoWhatIMeanSupport methodsFor:'code completion - Smalltalk'!
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1285
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1286
codeCompletionForSmalltalkClass: classOrNilArg context:contextOrNilArg codeView:codeViewArg
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1287
4379
f79671ee6211 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4378
diff changeset
  1288
    "OBSOLETE; migrating to use the the new 'xxx: into:' protocol.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1289
     contextOrNil is the current context, if this is called from the debugger;
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1290
     nil, if called from the browser.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1291
     If nonNil, we can make better guesses, because we actually know what a variable's type is.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1292
     This is not yet done, sigh"
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1293
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1294
    |crsrPos char interval source node parent checkedNode instanceOrNilArg
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1295
     forceNewMessageSend classOfReceiver prevChar|
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1296
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1297
    languageOrNil := SmalltalkLanguage instance.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1298
    classOrNil := classOrNilArg.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1299
    codeView := codeViewArg.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1300
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1301
    crsrPos := codeView characterPositionOfCursor"-1".
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1302
    char := codeView characterAtCharacterPosition:crsrPos.
4301
90f7571df306 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4284
diff changeset
  1303
    "/ Transcript show:crsrPos; show:' '; showCR:char.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1304
    [crsrPos > 1 and:[char isSeparator or:['.' includes:char]]] whileTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1305
        crsrPos := crsrPos - 1.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1306
        char := codeView characterAtCharacterPosition:crsrPos.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1307
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1308
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1309
    interval := codeView selectedInterval.
4301
90f7571df306 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4284
diff changeset
  1310
    "/ Transcript show:'iv: '; showCR:interval.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1311
    interval isEmpty ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1312
        interval := crsrPos"-1" to:crsrPos.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1313
        "/ Transcript show:'iv2: '; showCR:interval.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1314
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1315
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1316
    source := codeView contentsAsString string.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1317
    source := source copyTo:crsrPos.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1318
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1319
    "/ this is too naive and stupid; if there is a syntactic error,
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1320
    "/ we will not find a node for a long time (stepping back more and more,
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1321
    "/ until reaching the beginning). This leads to a thousand and more times reparsing
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1322
    "/ without any progress.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1323
    "/ TODO: do it vice-versa, in that the parser does a callOut for every node generated
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1324
    "/ as it parses the code. Stop, when the interval is hit.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1325
    "/ that will also work for syntactic incorrect source code.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1326
    classOrNil notNil ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1327
        node := self findNodeForInterval:interval in:source allowErrors:true mustBeMethod:true.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1328
        "/ Transcript show:'nd1: '; showCR:node.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1329
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1330
    node isNil ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1331
        node := self findNodeForInterval:interval in:source allowErrors:true mustBeMethod:false.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1332
        "/ Transcript show:'nd2 try: '; showCR:node.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1333
        node isNil ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1334
            "/ Transcript showCR:'No parseNode found (syntax error before or in comment?)'.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1335
            self breakPoint:#cg.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1336
            "/ self information:'No parseNode found (syntax error before or in comment?)'.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1337
            ^ self.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1338
        ]
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1339
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1340
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1341
    forceNewMessageSend := false.
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1342
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1343
    "/ if there a separator between the variable's name and the cursor position...
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1344
    prevChar := codeView characterBeforeCursor.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1345
    (prevChar isSeparator or:[ ')}]''' includes:prevChar ]) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1346
        (node isVariable
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1347
            and:[ (parent := node parent) notNil
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1348
            and:[ parent isMessage ]]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1349
        ) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1350
            "/ completion after a variable node...
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1351
            parent isKeyword ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1352
                "/ and it is a keyword message, we complete the keyword message instead
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1353
                node := parent.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1354
            ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1355
                "/ otherwise, a unary message is probably intended to be sent to the variable.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1356
                "/ (however, no character is available to determine what is useful)
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1357
                forceNewMessageSend := true.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1358
            ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1359
        ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1360
            (node isMessage and:[node isUnary]) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1361
                "/ expanding <rcvr> foo |<- cursor here (i.e. a space after foo)
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1362
                "/
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1363
                forceNewMessageSend := true.
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1364
"/                "/ can we see what we get from foo?
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1365
"/                classOfReceiver := self
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1366
"/                                    classOfReceiver:node receiver
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1367
"/                                    inClass:classOrNil instance:instanceOrNil context:contextOrNil.
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1368
"/                classOfReceiver notNil ifTrue:[
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1369
"/                    |mthd|
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1370
"/
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1371
"/                    mthd := classOfReceiver lookupMethodFor:node selector.
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1372
"/                    mthd notNil ifTrue:[
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1373
"/                        self halt.
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1374
"/                        (ParseTreeSearcher isDefinitelyGetterMethod:mthd) ifTrue:[
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1375
"/                            forceNewMessageSend := true.
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1376
"/                        ]
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1377
"/                    ]
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1378
"/                ].
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1379
            ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1380
        ]
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1381
    ].
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1382
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1383
    forceNewMessageSend ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1384
        "/ completion with nothing to start (right after a variable)
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1385
        "/ see what the variable can understand and present the most useful stuff (very thin ice here)
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1386
        classOfReceiver := self classOfNode:node.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1387
        classOfReceiver isNil ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1388
            "/ it does not make sense to offer anything, if we don't have any idea of what this
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1389
            "/ will be...
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1390
            Screen current beep.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1391
        ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1392
            |superClass possible choice|
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1393
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1394
            possible := classOfReceiver selectors.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1395
            superClass := classOfReceiver superclass.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1396
            [superClass notNil and:[(possible size + superClass selectors size) < 50]] whileTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1397
                possible := possible,superClass selectors.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1398
                superClass := superClass superclass.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1399
            ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1400
            possible := possible copy sort.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1401
            choice := self askUserForCompletion:('Message to "%1"' bindWith:node name) for:codeView from:possible.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1402
            choice isNil ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1403
                Screen current beep.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1404
                ^ self
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1405
            ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1406
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1407
            codeView
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1408
                undoableDo:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1409
                    codeView insertStringAtCursor:choice
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1410
                ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1411
                info:'Completion'.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1412
        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1413
        ^ self
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1414
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1415
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1416
    node isVariable ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1417
        self codeCompletionForVariable:node inClass:classOrNil codeView:codeView.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1418
        ^ self.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1419
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1420
    node isLiteral ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1421
        node value isSymbol ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1422
            self codeCompletionForLiteralSymbol:node inClass:classOrNil codeView:codeView.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1423
            ^ self.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1424
        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1425
        ^ self "/ huh - strings or what?
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1426
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1427
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1428
    checkedNode := node.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1429
    [checkedNode notNil] whileTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1430
        checkedNode isMessage ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1431
            "/ completion in a message-send
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1432
            contextOrNilArg notNil ifTrue:[
4329
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1433
"/                |rcvrNode idx rcvr val|
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1434
"/
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1435
"/                (rcvrNode := checkedNode receiver) isVariable ifTrue:[
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1436
"/                    rcvrNode isSelf ifTrue:[
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1437
"/                        classOrNil := contextOrNil receiver class.
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1438
"/                    ] ifFalse:[
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1439
"/                        (idx := contextOrNil argAndVarNames indexOf:rcvrNode name) ~~ 0 ifTrue:[
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1440
"/                            val := contextOrNil argsAndVars at:idx.
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1441
"/                            classOrNil := val class.
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1442
"/                        ] ifFalse:[
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1443
"/                            (idx := contextOrNil receiver class allInstVarNames indexOf:rcvrNode name) ~~ 0 ifTrue:[
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1444
"/                                val := contextOrNil receiver instVarNamed:rcvrNode name.
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1445
"/                                classOrNil := val class.
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1446
"/                            ]
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1447
"/                        ]
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1448
"/                    ]
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1449
"/                ].
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1450
                instanceOrNilArg := contextOrNilArg receiver
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1451
            ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1452
            self
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1453
                codeCompletionForMessage:checkedNode
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1454
                inClass:classOrNil instance:instanceOrNilArg
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1455
                context:contextOrNilArg codeView:codeView.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1456
            ^ self
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1457
        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1458
        checkedNode isMethod ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1459
            "/ completion in a method's selector pattern
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1460
            self codeCompletionForMethodSpec:checkedNode.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1461
            ^ self.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1462
        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1463
        checkedNode := checkedNode parent.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1464
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1465
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1466
    self information:'Node is neither variable nor message.'.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1467
4392
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1468
    "Created: / 18-09-2013 / 15:25:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1469
!
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1470
4392
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1471
codeCompletionForSmalltalkMethod:methodOrNilArg orClass:classOrNilArg context:contextOrNilArg codeView:codeViewArg into:actionBlock
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1472
    "provide code completion information by analyzing what the editing state is in codeViewArg
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1473
     (cursor position, characters around cursor etc.) and calling back into actionBlock, passing
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1474
     the info as argument. 
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1475
     The interface has been defined in that way 
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1476
     (and tight coupling with internals of the editor) because
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1477
        1) the completer needs to know about the text around the cursor position
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1478
        2) the edit operation for completion may be non-trivial
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1479
           (although not yet fully implemented, non-local rewrite procedures may and will be added in the future
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1480
     For example, in many situations, both a completion of a unary selector before the cursor,
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1481
     or adding another keyword part after the cursor is possible.
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1482
     Thus, this provides a list of completions PLUS a list of edit operations (as per completion), to
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1483
     perform the completion.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1484
     The caller has to open a dialog, providing the suggestions, and perform the corresponding edit operation.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1485
     An additional array containing a textual description for each suggestion is also provided, which could
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1486
     be shown as info or appended to the suggestions (such as 'complete variable', 'complete keyword', etc.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1487
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1488
     ContextOrNil is the current context, if this is called from the debugger;
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1489
     or nil, if called from the browser.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1490
     If nonNil, we can make better guesses, because we actually know what a variable's type is"
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1491
4524
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  1492
    |crsrPos char interval i source partialSource cursorLineSource
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  1493
     suggestions actions title|
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1494
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1495
    languageOrNil := SmalltalkLanguage instance.
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1496
    methodOrNil := methodOrNilArg.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1497
    classOrNil := classOrNilArg.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1498
    codeView := codeViewArg.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1499
    contextOrNil := contextOrNilArg.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1500
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1501
"/    classOrNil isNil ifTrue:[
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1502
"/        self information:'No class'.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1503
"/        ^ self.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1504
"/    ].
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1505
4524
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  1506
    crsrPos := codeView characterPositionOfCursor.
4592
ba8cb2c6ef61 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4591
diff changeset
  1507
    char := codeView characterAtCharacterPosition:(crsrPos-1 max:1).
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1508
    [crsrPos > 1 and:[char isSeparator "or:['.' includes:char]"]] whileTrue:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1509
        crsrPos := crsrPos - 1.
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1510
        char := codeView characterAtCharacterPosition:crsrPos.
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1511
    ].
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1512
4711
1c2e635489e5 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4710
diff changeset
  1513
    char == $. ifTrue:[
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1514
        "/ either at end of statement or after a character constant
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1515
        crsrPos == 1 ifTrue:[^ self].
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1516
        (codeView characterAtCharacterPosition:crsrPos-1) == $$ ifFalse:[^ self].
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1517
    ].
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1518
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1519
    interval := crsrPos-1 to:crsrPos.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1520
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1521
    source := codeView contentsAsString string.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1522
    partialSource := source copyTo:crsrPos.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1523
4524
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  1524
    methodOrNilArg isNil ifTrue:[
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1525
        "/ first try parsing the current cursor line.
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1526
        "/ this helps doIts in a workspace, where additional garbage is often before the actual expression to be evaluated
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1527
        (i := partialSource lastIndexOf:Character cr) ~~ 0 ifTrue:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1528
            "/ because cursorPositions and node-positions are required elsewhere to be correct,
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1529
            "/ I cannot just snip off the line and parse that one alone (later corrections will do so at wrong position).
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1530
            "/ Instead, create a copy of the whole source, with the stuff before the cursor lne being blanked out.
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1531
            cursorLineSource := partialSource copy.
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1532
            cursorLineSource from:1 to:i put:Character space.
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1533
            self
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1534
                tryCodeCompletionWithSource:cursorLineSource nodeInterval:interval
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1535
                at:crsrPos mustBeExpression:true
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1536
                into:[:listOfSuggestions :listOfActions :titleWhenAsking |
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1537
                    suggestions := listOfSuggestions.
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1538
                    actions := listOfActions.
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1539
                    title := titleWhenAsking.
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1540
                ].
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1541
            suggestions notEmptyOrNil ifTrue:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1542
                actionBlock value:suggestions value:actions value:title.
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1543
                ^ self.
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1544
            ].
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1545
        ].
4524
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  1546
    ].
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  1547
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  1548
    "/ try parsing the partial source (from beginning up to the cursor)
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1549
    self
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1550
        tryCodeCompletionWithSource:partialSource nodeInterval:interval
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1551
        at:crsrPos mustBeExpression:(classOrNilArg isNil and:[methodOrNilArg isNil])
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1552
        into:[:listOfSuggestions :listOfActions :titleWhenAsking |
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1553
            suggestions := listOfSuggestions.
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1554
            actions := listOfActions.
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1555
            title := titleWhenAsking.
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1556
            "/ suggestions1 size>100 ifTrue:[ self halt].
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1557
        ].
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1558
4524
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  1559
    suggestions notEmptyOrNil ifTrue:[
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1560
        actionBlock value:suggestions value:actions value:title.
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1561
        ^ self.
4524
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  1562
    ].
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  1563
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  1564
    "/ then try parsing the whole source (from beginning up to the cursor)
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1565
    self
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1566
        tryCodeCompletionWithSource:source nodeInterval:interval
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1567
        at:crsrPos mustBeExpression:false
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1568
        into:[:listOfSuggestions :listOfActions :titleWhenAsking |
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1569
            suggestions := listOfSuggestions.
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1570
            actions := listOfActions.
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1571
            title := titleWhenAsking.
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1572
        ].
4524
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  1573
    suggestions notEmptyOrNil ifTrue:[
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1574
        actionBlock value:suggestions value:actions value:title.
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1575
    ].
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1576
4392
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1577
    "Created: / 18-09-2013 / 15:25:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1578
! !
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1579
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1580
!DoWhatIMeanSupport methodsFor:'code completion - obsolete'!
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1581
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1582
codeCompletionForClass:classOrNilArg context:contextOrNil codeView:codeViewArg
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1583
    <resource: #obsolete>
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1584
    "OBSOLETE; migrating to use the the new 'xxx: into:' protocol.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1585
     contextOrNil is the current context, if this is called from the debugger;
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1586
     nil, if called from the browser.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1587
     If nonNil, we can make better guesses, because we actually know what a variable's type is.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1588
     This is not yet done, sigh"
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1589
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1590
    ^self codeCompletionForLanguage: nil class:classOrNilArg context:contextOrNil codeView:codeViewArg
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1591
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1592
    "Modified: / 04-07-2006 / 18:48:26 / fm"
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1593
    "Modified: / 28-08-2013 / 17:15:25 / cg"
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1594
    "Modified: / 18-09-2013 / 14:15:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1595
!
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1596
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1597
codeCompletionForMethod:methodOrNilArg orClass:classOrNilArg context:contextOrNilArg codeView:codeViewArg into:actionBlock
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1598
    <resource: #obsolete>
4524
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  1599
    ^ self
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1600
	codeCompletionForSmalltalkMethod:methodOrNilArg orClass:classOrNilArg context:contextOrNilArg codeView:codeViewArg into:actionBlock
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1601
! !
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1602
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1603
!DoWhatIMeanSupport methodsFor:'code completion-helpers'!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1604
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1605
askUserForCompletion:what for:codeView at:position from:allTheBest
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1606
    |list choice lastChoice|
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1607
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1608
    "/ cg: until the new stuff works,...
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1609
    ^ self old_askUserForCompletion:what for:codeView from:allTheBest.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1610
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1611
"/    allTheBest isEmpty ifTrue:[
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1612
"/        ^ nil
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1613
"/    ].
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1614
"/    allTheBest size == 1 ifTrue:[
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1615
"/        ^ allTheBest first
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1616
"/    ].
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1617
"/    list := allTheBest.
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1618
"/    LastChoices notNil ifTrue:[
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1619
"/        lastChoice := LastChoices at:what ifAbsent:nil.
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1620
"/        lastChoice notNil ifTrue:[
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1621
"/            list := { lastChoice allBold } , (list copyWithout:lastChoice).
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1622
"/        ].
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1623
"/    ].
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1624
"/    choice := Tools::CodeCompletionMenu
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1625
"/                openFor:codeView
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1626
"/                at:position
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1627
"/                with:allTheBest.
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1628
"/    LastChoices isNil ifTrue:[
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1629
"/        LastChoices := Dictionary new.
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1630
"/    ].
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1631
"/    LastChoices at:what put:choice.
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1632
"/    ^ choice string
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1633
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1634
    "Created: / 16-02-2010 / 10:09:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1635
    "Modified: / 28-08-2013 / 16:41:35 / cg"
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1636
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1637
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1638
askUserForCompletion:what for:codeView from:allTheBest
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1639
    |list resources choice lastChoice|
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1640
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1641
    allTheBest isEmpty ifTrue:[ ^ nil ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1642
    allTheBest size == 1 ifTrue:[ ^ allTheBest first ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1643
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1644
    list := allTheBest.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1645
    LastChoices notNil ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1646
	lastChoice := LastChoices at:what ifAbsent:nil.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1647
	lastChoice notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1648
	    list := {lastChoice. nil. } , (list copyWithout:lastChoice).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1649
	].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1650
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1651
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1652
    list size < 30 ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1653
	|menu idx exitKey|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1654
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1655
	menu := PopUpMenu labels:list.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1656
	menu hideOnKeyFilter:[:key | |hide|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1657
		hide := ( #( CursorDown CursorUp Escape Return ) includes: key) not.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1658
		hide ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1659
		    exitKey := key.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1660
		].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1661
		hide].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1662
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1663
	idx := menu startUp.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1664
	idx == 0 ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1665
	    exitKey notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1666
		codeView keyPress:exitKey x:0 y:0.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1667
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1668
	    ^ nil
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1669
	].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1670
	choice := list at:idx.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1671
    ] ifFalse:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1672
	resources := codeView application isNil
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1673
			ifTrue:[ codeView resources]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1674
			ifFalse:[ codeView application resources ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1675
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1676
	choice := Dialog
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1677
	   choose:(resources string:'Choose ',what)
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1678
	   fromList:list
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1679
	   lines:20
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1680
	   title:(resources string:'Code completion').
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1681
	choice isNil ifTrue:[^ nil].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1682
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1683
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1684
    LastChoices isNil ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1685
	LastChoices := Dictionary new.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1686
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1687
    LastChoices at:what put:choice.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1688
    ^ choice
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1689
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1690
    "Created: / 10-11-2006 / 14:00:53 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1691
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1692
4358
d9978bce6853 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4356
diff changeset
  1693
classOfNode:aNode
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1694
    "when showing possible completions for a message,
4422
ee7c441fce69 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4421
diff changeset
  1695
     it is a good idea to know what the kind receiver is."
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1696
4427
fb066a08ef83 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4426
diff changeset
  1697
    | nm nodeVal receiverClass nodeSelector nodeReceiver mthd|
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1698
4418
149eefdc6206 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4417
diff changeset
  1699
    aNode isBlock ifTrue:[
4727
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1700
        ^ Block
4418
149eefdc6206 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4417
diff changeset
  1701
    ].
4422
ee7c441fce69 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4421
diff changeset
  1702
ee7c441fce69 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4421
diff changeset
  1703
    (nodeVal := self valueOfNode:aNode) notNil ifTrue:[
4727
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1704
        "/ knowing the value is always great!!
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1705
        ^ nodeVal class
4422
ee7c441fce69 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4421
diff changeset
  1706
    ].
ee7c441fce69 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4421
diff changeset
  1707
4358
d9978bce6853 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4356
diff changeset
  1708
    aNode isVariable ifTrue:[
4727
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1709
        nm := aNode name.
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1710
        nm = 'self' ifTrue:[
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1711
            classOrNil isNil ifTrue:[^ UndefinedObject].
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1712
            ^ classOrNil
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1713
        ].
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1714
        nm = 'super' ifTrue:[
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1715
            classOrNil isNil ifTrue:[^ Object].
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1716
            ^ classOrNil superclass
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1717
        ].
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1718
        nm = 'thisContext' ifTrue:[
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1719
            ^ Context
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1720
        ].
4422
ee7c441fce69 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4421
diff changeset
  1721
ee7c441fce69 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4421
diff changeset
  1722
"/        classOrNil notNil ifTrue:[
ee7c441fce69 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4421
diff changeset
  1723
"/            (classOrNil allInstVarNames includes:nm) ifTrue:[
ee7c441fce69 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4421
diff changeset
  1724
"/                "/ could look at existing instances here...
ee7c441fce69 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4421
diff changeset
  1725
"/                self breakPoint:#cg.
ee7c441fce69 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4421
diff changeset
  1726
"/            ].
ee7c441fce69 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4421
diff changeset
  1727
"/        ].
4727
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1728
        ^ nil
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1729
    ].
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1730
4358
d9978bce6853 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4356
diff changeset
  1731
    aNode isMessage ifTrue:[
4727
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1732
        nodeSelector := aNode selector.
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1733
        nodeReceiver := aNode receiver.
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1734
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1735
        "/ some hardwired knowlegde here
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1736
        receiverClass := self classOfNode:nodeReceiver.
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1737
        receiverClass notNil ifTrue:[
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1738
            nodeSelector == #class ifTrue:[
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1739
                ^ receiverClass class
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1740
            ].
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1741
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1742
            receiverClass isBehavior ifTrue:[
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1743
                mthd := receiverClass lookupMethodFor:nodeSelector.
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1744
                receiverClass isMeta ifTrue:[
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1745
                    ( #( #'new' #'basicNew' #'new:' #'basicNew:' #'with:' #'with:with:') includes: nodeSelector ) ifTrue:[
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1746
                        ^ receiverClass theNonMetaclass
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1747
                    ].
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1748
                    "/ if that method sends one of new/basicNew/new:/basicNew:, assume it returns an instance of itself
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1749
                    mthd notNil ifTrue:[
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1750
                        ( mthd sendsAny:#( #'new' #'basicNew' #'new:' #'basicNew:' )) ifTrue:[
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1751
                            ^ receiverClass theNonMetaclass
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1752
                        ].
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1753
                    ].
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1754
                ] ifFalse:[
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1755
                    mthd notNil ifTrue:[
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1756
                        (ParseTreeSearcher methodIsSetterMethod:mthd) ifTrue:[
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1757
                            ^ receiverClass.
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1758
                        ]
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1759
                    ]
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1760
                ]
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1761
            ].
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1762
        ].
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1763
        classOrNil notNil ifTrue:[
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1764
            (nodeReceiver isSelf and:[nodeSelector = #'class']) ifTrue:[
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1765
                ^ classOrNil class
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1766
            ].
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1767
        ].
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1768
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1769
        (nodeSelector = #'asFilename') ifTrue:[
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1770
            ^ Filename
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1771
        ].
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1772
        (nodeSelector = #'asOrderedCollection') ifTrue:[
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1773
            ^ OrderedCollection
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1774
        ].
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1775
        (nodeSelector = #'asArray') ifTrue:[
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1776
            ^ Array
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1777
        ].
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1778
        (nodeSelector = #'asSet') ifTrue:[
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1779
            ^ Set
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1780
        ].
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1781
        (nodeSelector = #'size') ifTrue:[
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1782
            ^ SmallInteger
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1783
        ].
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1784
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1785
        "/ some wellknown boolean returners (need better type inference here)
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1786
        (#( isNil notNil not isEmptyOrNil notEmptyOrNil notEmpty isEmpty
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1787
            isBehavior isMeta
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1788
            = ~= == ~~ > >= < <=
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1789
            includes: contains:
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1790
            and: or:
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1791
            exists atEnd
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1792
        ) includes:nodeSelector ) ifTrue:[
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1793
            ^ True "/ Boolean - not boolean; it does not contain the full protocol (would not find ifTrue:)
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1794
        ].
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1795
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1796
        ( #( + - * / // \\ ) includes:nodeSelector) ifTrue:[
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1797
            "/ assume numeric
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1798
            ^ Number
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1799
        ].
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1800
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1801
        ( #( class theMetaclass theNonMetaclass ) includes:nodeSelector) ifTrue:[
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1802
            "/ assume behavior
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1803
            ^ Behavior
983f74d3c7a1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4711
diff changeset
  1804
        ].
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1805
    ].
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1806
    ^ nil
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1807
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1808
    "Created: / 28-08-2013 / 16:34:53 / cg"
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1809
!
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1810
4382
e92f704c63ec class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4381
diff changeset
  1811
codeCompletionForLiteralSymbol:nodeOrNil element:tokenOrNil considerAll:considerAll into:actionBlock
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1812
    "looking for all symbols is way too much and inprecise;
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1813
     experiment: only present symbols which are used by the class,
4544
a07061d382ce class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4543
diff changeset
  1814
     and classes in that class category, or at least: implemented as method.
a07061d382ce class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4543
diff changeset
  1815
     We'll see..."
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1816
4382
e92f704c63ec class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4381
diff changeset
  1817
    |sym possibleCompletions longest editAction start stop addSymbol
e92f704c63ec class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4381
diff changeset
  1818
     parentSelector parent symbolSelectorClass|
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1819
4302
f115f2ff999d class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4301
diff changeset
  1820
    "/ Transcript show:'lit in '; show:methodOrNil; show:' / '; showCR:classOrNil.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1821
4382
e92f704c63ec class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4381
diff changeset
  1822
    start := (nodeOrNil ? tokenOrNil) start.
e92f704c63ec class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4381
diff changeset
  1823
    stop := (nodeOrNil ? tokenOrNil) stop.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1824
    (codeView characterAtCharacterPosition:stop) == $' ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1825
	^ self.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1826
    ].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1827
4382
e92f704c63ec class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4381
diff changeset
  1828
    sym := (nodeOrNil ? tokenOrNil) value.
4544
a07061d382ce class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4543
diff changeset
  1829
    possibleCompletions := Set new.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1830
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1831
    addSymbol :=
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1832
	[:aSymbol |
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1833
	    (aSymbol startsWith:sym) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1834
		(aSymbol = sym) ifFalse:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1835
		    possibleCompletions add:aSymbol
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1836
		].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1837
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1838
	].
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1839
4382
e92f704c63ec class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4381
diff changeset
  1840
    (nodeOrNil notNil
e92f704c63ec class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4381
diff changeset
  1841
    and:[ (parent := nodeOrNil parent) notNil
e92f704c63ec class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4381
diff changeset
  1842
    and:[ parent isMessage ]]) ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1843
	parentSelector := parent selector.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1844
	( #( perform: perform:ifNotUnderstood: ) includes: parentSelector) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1845
	    symbolSelectorClass := self classOfNode:parent receiver.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1846
	].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1847
	( #( #'onChangeSend:' ) includes: parentSelector) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1848
	    "/ assume that send-target will be self.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1849
	    (methodOrNil notNil and:[ methodOrNil selector notNil and:[ methodOrNil selector isUnarySelector ]]) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1850
		addSymbol value:(methodOrNil selector,'Changed').
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1851
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1852
	    symbolSelectorClass := classOrNil.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1853
	].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1854
	( #( #'onChangeSend:to:' ) includes: parentSelector) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1855
	    symbolSelectorClass := self classOfNode:parent arguments second.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1856
	].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1857
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1858
	symbolSelectorClass notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1859
	    symbolSelectorClass withAllSuperclassesDo:[:cls |
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1860
		cls ~~ Object ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1861
		    cls ~~ Model ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1862
			cls methodDictionary keysDo:addSymbol.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1863
		    ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1864
		]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1865
	    ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1866
	].
4382
e92f704c63ec class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4381
diff changeset
  1867
    ].
e92f704c63ec class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4381
diff changeset
  1868
4368
442517f0d19d class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4367
diff changeset
  1869
    (considerAll or:[classOrNil isNil]) ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1870
	Smalltalk allClassesDo:[:cls |
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1871
	    cls theNonMetaclass methodDictionary keys do:addSymbol.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1872
	    cls theMetaclass methodDictionary keys do:addSymbol.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1873
	].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1874
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1875
	"/ Symbol allInstancesDo:addSymbol.
4368
442517f0d19d class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4367
diff changeset
  1876
    ] ifFalse:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1877
	Smalltalk allClassesInCategory:classOrNil do:[:cls |
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1878
	    cls theNonMetaclass instAndClassMethodsDo:[:mthd |
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1879
		mthd usedSymbols do:addSymbol
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1880
	    ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1881
	].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1882
    ].
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1883
4544
a07061d382ce class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4543
diff changeset
  1884
    possibleCompletions := possibleCompletions asOrderedCollection sort.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1885
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1886
    longest := possibleCompletions longestCommonPrefix.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1887
    possibleCompletions remove:longest ifAbsent:[].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1888
    possibleCompletions addFirst: longest.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1889
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1890
    editAction :=
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1891
	[:chosenIndex |
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1892
	    |chosen oldSym oldLen newLen|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1893
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1894
	    chosen := possibleCompletions at:chosenIndex.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1895
	    chosen notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1896
		(codeView characterAtCharacterPosition:start) == $# ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1897
		    start := start + 1.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1898
		].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1899
		(codeView characterAtCharacterPosition:start) == $' ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1900
		    start := start + 1.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1901
		].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1902
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1903
		oldSym := (codeView textFromCharacterPosition:start to:stop) asString string withoutSeparators.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1904
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1905
		codeView
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1906
		    undoableDo:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1907
			codeView replaceFromCharacterPosition:start to:stop with:chosen
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1908
		    ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1909
		    info:'Completion'.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1910
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1911
		(chosen startsWith:oldSym) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1912
		    oldLen := stop - start + 1.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1913
		    newLen := chosen size.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1914
		    codeView selectFromCharacterPosition:start+oldLen to:start+newLen-1.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1915
		    codeView dontReplaceSelectionOnInput
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1916
		].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1917
	    ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1918
	].
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1919
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1920
    actionBlock value:possibleCompletions value:editAction value:'symbol'.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1921
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1922
    "Modified: / 16-02-2010 / 10:15:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1923
    "Modified (format): / 03-07-2011 / 15:58:45 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1924
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1925
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1926
codeCompletionForMessage:node into:actionBlock
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1927
    |selector srchClass implClass
4416
ebb04dca4484 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4413
diff changeset
  1928
     bestSelectors selector2 bestSelectors2 bestSelectors3 allBest best info numArgs
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1929
     newParts nSelParts oldLen newLen selectorParts
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1930
     findBest parentNode nodeReceiver selectorsSentInCode split editAction parentNodeClassIfKnown
4408
18567ee46c6a class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4407
diff changeset
  1931
     receiverNodeClassIfKnown|
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1932
4302
f115f2ff999d class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4301
diff changeset
  1933
    "/ Transcript show:'msg in '; show:methodOrNil; show:' / '; showCR:classOrNil.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1934
4620
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1935
    findBest := 
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1936
        [:node :selector |
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1937
            |srchClass srchClasses bestSelectors bestPrefixes
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1938
             allMessagesSentToVariable classesImplementingAllMessages|
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1939
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1940
            srchClass := self classOfNode:node.
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1941
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1942
            srchClass isNil ifTrue:[
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1943
                node isVariable ifTrue:[
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1944
                    allMessagesSentToVariable := Set new.
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1945
                    rememberedNodes do:[:eachNode |
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1946
                        eachNode allMessageNodes do:[:eachMessage |
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1947
                            eachMessage receiver isVariable ifTrue:[
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1948
                                eachMessage receiver name = node name ifTrue:[
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1949
                                    eachMessage selector ~= selector ifTrue:[
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1950
                                        allMessagesSentToVariable add:eachMessage selector
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1951
                                    ]
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  1952
                                ]
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  1953
                            ]
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  1954
                        ]
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  1955
                    ].
4620
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1956
                    allMessagesSentToVariable notEmpty ifTrue:[
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1957
                        "/ consider classes which implement all those messages.
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1958
                        classesImplementingAllMessages := Smalltalk allImplementorsOf:(allMessagesSentToVariable first).
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1959
                        allMessagesSentToVariable do:[:eachSelector |
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1960
                            classesImplementingAllMessages := classesImplementingAllMessages
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1961
                                                                select:[:cls | cls implements:eachSelector].
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1962
                        ].
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1963
                        srchClasses := classesImplementingAllMessages.
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1964
                    ].
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  1965
                ].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  1966
            ].
4620
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1967
            bestSelectors := Set new.
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1968
            srchClasses isEmptyOrNil ifTrue:[ srchClasses := Array with:srchClass ].
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1969
            srchClasses do:[:srchClass |
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1970
                |bestForThisClass|
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1971
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1972
                bestForThisClass := Parser findBest:50 selectorsFor:selector in:srchClass forCompletion:true.
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1973
                bestForThisClass := self
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1974
                                    withoutSelectorsUnlikelyFor:srchClass
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1975
                                    from:bestForThisClass
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1976
                                    forPartial:selector.
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1977
                bestSelectors addAll:bestForThisClass.
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1978
            ].
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1979
            (bestSelectors includes:selector) ifTrue:[
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1980
                bestSelectors := bestSelectors select:[:sel | sel size > selector size].
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1981
            ].
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1982
            bestSelectors := bestSelectors asOrderedCollection.
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1983
            bestSelectors
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  1984
        ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1985
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1986
    selector := node selector.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1987
    parentNode := node parent.
4408
18567ee46c6a class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4407
diff changeset
  1988
    nodeReceiver := node receiver.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1989
4366
8041b628bba3 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4365
diff changeset
  1990
    "/ if there is already space before the cursor, and the parent node is not a message,
4620
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1991
    "/ do not attempt to complete the current message.
4366
8041b628bba3 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4365
diff changeset
  1992
    "/ If it is a message, we will look for parent-message completion also below (best2 stuff)
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1993
    (codeView characterBeforeCursor ? $ ) isSeparator ifTrue:[
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  1994
        (parentNode notNil and:[ parentNode isMessage ]) ifFalse:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  1995
            ^ self.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  1996
        ].
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1997
    ].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1998
4620
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1999
    "/ only do this if the node-message has no parents around
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  2000
    node parentheses isEmptyOrNil ifTrue:[
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  2001
        bestSelectors := findBest value:nodeReceiver value:selector.
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  2002
    ] ifFalse:[
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  2003
        bestSelectors := OrderedCollection new.
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  2004
    ].
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2005
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2006
    "/ if the receiver is a real variable,
4386
d5b6d7c0b6ee class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4385
diff changeset
  2007
    "/ we can look for other messages being sent to that variable in the current method.
4408
18567ee46c6a class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4407
diff changeset
  2008
    "/ Also, if there is are assignment to it (like constants or '<class> new'), use that as a hint...
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2009
    (tree notNil
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2010
        and:[ nodeReceiver isVariable
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2011
        and:[ nodeReceiver isSelf not
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2012
        and:[ nodeReceiver isSuper not ]]])
4366
8041b628bba3 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4365
diff changeset
  2013
    ifTrue:[
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2014
        |classesFromAssignmentsToReceiver otherMessagesToReceiver possibleClasses possibleClassesFromOtherSends|
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2015
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2016
        classesFromAssignmentsToReceiver := tree allAssignmentNodes
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2017
                                    collect:[:eachAssignmentNode |
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2018
                                                |cls|
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2019
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2020
                                                (nodeReceiver = eachAssignmentNode variable
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2021
                                                    and:[ (cls := self classOfNode:eachAssignmentNode value) notNil ]
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2022
                                                ) ifTrue:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2023
                                                    cls
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2024
                                                ] ifFalse:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2025
                                                    nil
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2026
                                                ]
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2027
                                            ]
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2028
                                    thenSelect:[:classOrNil | classOrNil notNil].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2029
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2030
        possibleClasses := classesFromAssignmentsToReceiver.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2031
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2032
        otherMessagesToReceiver := tree allMessageNodes
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2033
                                    select:[:eachMessageNode |
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2034
                                                nodeReceiver = eachMessageNode receiver
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2035
                                                and:[ selector ~= eachMessageNode selector]]
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2036
                                    thenCollect:[:eachNode | eachNode selector].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2037
        otherMessagesToReceiver notEmpty ifTrue:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2038
            otherMessagesToReceiver := otherMessagesToReceiver asSet.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2039
            possibleClassesFromOtherSends :=
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2040
                Smalltalk allClassesForWhich:
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2041
                            [:cls |
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2042
                                cls isLoaded
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2043
                                and:[ otherMessagesToReceiver
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2044
                                        conform:[:eachSelectorSent | cls includesSelector: "canUnderstand:" eachSelectorSent]]
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2045
                            ].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2046
            possibleClasses := possibleClasses , possibleClassesFromOtherSends.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2047
        ].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2048
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2049
        "/ if the receiver is a class/classInstVar,
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2050
        "/ include the class of its current value and UndefinedObject.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2051
        "/ This helps to complete class methods and (lazy) initializer code.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2052
        (classOrNil notNil) ifTrue:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2053
            |tryValue currentValue|
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2054
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2055
            tryValue := false.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2056
            (classOrNil theNonMetaclass allClassVarNames includes: nodeReceiver name) ifTrue:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2057
                tryValue := true.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2058
                currentValue := classOrNil theNonMetaclass classVarAt:nodeReceiver name.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2059
            ] ifFalse:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2060
                (classOrNil isMeta and:[ classOrNil allInstVarNames includes: nodeReceiver name ]) ifTrue:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2061
                    tryValue := true.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2062
                    currentValue := classOrNil theNonMetaclass instVarNamed:nodeReceiver name.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2063
                ].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2064
            ].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2065
            tryValue ifTrue:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2066
                currentValue notNil ifTrue:[ possibleClasses := { UndefinedObject } , possibleClasses ].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2067
                possibleClasses := { currentValue class } , possibleClasses.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2068
            ].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2069
        ].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2070
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2071
        (possibleClasses notEmpty and:[possibleClasses size < 15]) ifTrue:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2072
            bestSelectors := Set new.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2073
            possibleClasses do:[:eachClass |
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2074
                |bestSelectorsForClass|
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2075
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2076
                bestSelectorsForClass := Parser findBest:30 selectorsFor:selector in:eachClass forCompletion:true.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2077
                bestSelectors addAll:bestSelectorsForClass.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2078
            ].
4619
edb90d73576b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4618
diff changeset
  2079
            bestSelectors := bestSelectors asOrderedCollection.
edb90d73576b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4618
diff changeset
  2080
edb90d73576b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4618
diff changeset
  2081
            "/ if any of those is a prefix-keyword of the selector,
edb90d73576b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4618
diff changeset
  2082
            "/ do not offer it (i.e. ifTrue:ifFalse: is already present, don't offer ifTrue:ifFalse: again.
edb90d73576b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4618
diff changeset
  2083
            bestSelectors := bestSelectors reject: [:sel | (selector startsWith: sel) or: [selector endsWith: sel]].
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2084
        ].
4619
edb90d73576b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4618
diff changeset
  2085
    ].                                                                            
4366
8041b628bba3 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4365
diff changeset
  2086
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2087
    "/ if we are behind a keyword messages colon,
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2088
    "/ only look for matching prefix selectors;
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2089
    "/ also, a good completion is to insert an argument;
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2090
    "/ the name of the variable from the implementation, as comment, and selected might be a good one!!
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2091
    selector isKeyword ifTrue:[
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2092
        codeView characterBeforeCursor == $: ifTrue:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2093
            bestSelectors := bestSelectors select:[:sel | sel startsWith:selector].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2094
            bestSelectors isEmpty ifTrue:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2095
                "/ nothing better around
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2096
                |argIndex argNames impls|
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2097
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2098
                argIndex := node selectorParts size.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2099
                argNames := Set new.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2100
                impls := Smalltalk allImplementorsOf:selector.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2101
                impls size < 10 ifTrue:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2102
                    impls do:[:eachImplClass |
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2103
                        |mthd argName|
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2104
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2105
                        mthd := (eachImplClass compiledMethodAt:selector).
4764
3142fc3b57cd class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4731
diff changeset
  2106
                        argName := (mthd methodArgNames ? #()) at:argIndex ifAbsent:nil.
3142fc3b57cd class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4731
diff changeset
  2107
                        argName notNil ifTrue:[
3142fc3b57cd class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4731
diff changeset
  2108
                            argNames add:(argName,' in (' ,mthd mclass name allBold,' ',mthd methodDefinitionTemplate).
3142fc3b57cd class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4731
diff changeset
  2109
                        ].
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2110
                    ].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2111
                    argNames notEmptyOrNil ifTrue: [
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2112
                        argNames := argNames asOrderedCollection sort.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2113
                        actionBlock
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2114
                            value:argNames
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2115
                            value:[:selIndex |
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2116
                                  ]
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2117
                            value: 'argument name hint'.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2118
                        ^ self.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2119
                    ]
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2120
                ]
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2121
            ]
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2122
        ].
4369
810a78e62f88 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4368
diff changeset
  2123
    ] ifFalse:[
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2124
        "/ when completing a non-keyword AND the parent is a keyword message,
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2125
        "/ only consider longer keyword messages or unary messages
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2126
        (parentNode notNil and:[ parentNode isMessage and:[parentNode selector isKeywordSelector ]]) ifTrue:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2127
            bestSelectors := bestSelectors select:[:sel | sel isUnarySelector ]
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2128
        ]
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2129
    ].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2130
4358
d9978bce6853 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4356
diff changeset
  2131
    bestSelectors := bestSelectors asOrderedCollection sort:[:a :b | a size < b size].
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2132
    (selector isUnarySelector
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2133
    and:[ parentNode notNil
4358
d9978bce6853 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4356
diff changeset
  2134
    and:[ parentNode isMessage ]]) ifTrue:[
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2135
        (selector2 := parentNode selector) isKeywordSelector ifTrue:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2136
            "/ if its a unary message AND the parent is a keyword node, look for parent completion too.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2137
            "/ i.e. look if there is a longer keyword possible
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2138
            selector2 := selector2,selector.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2139
            bestSelectors2 := findBest value:parentNode receiver value:selector2.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2140
            bestSelectors2 := bestSelectors2 select:[:sel | sel isKeywordSelector and:[ sel startsWith:selector2]].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2141
            bestSelectors2 := bestSelectors2 asOrderedCollection sort:[:a :b | a size < b size].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2142
            bestSelectors := bestSelectors reject:[:sel | bestSelectors2 includes:sel].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2143
        ] ifFalse:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2144
            |kwSels|
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2145
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2146
            "/ if its a unary message AND the parent is a unary or binary node, try again, sending the partial message
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2147
            "/ as a keyword to the parent node.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2148
            "/ this is the case when after "foo binOp bar if", which should include ifTrue: in the result.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2149
            "/ transform from
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2150
            "/    foo == (shift if)
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2151
            "/        nonKWsel-msg(parent)
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2152
            "/     /         \
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2153
            "/    /           \
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2154
            "/  rcvr         sel-unary(node)
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2155
            "/              /
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2156
            "/             /
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2157
            "/           arg
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2158
            "/
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2159
            "/ into:
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2160
            "/    (foo == shift) if
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2161
            "/
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2162
            "/        nonKWsel-msg(parent)
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2163
            "/     /         \
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2164
            "/    /           \
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2165
            "/  rcvr         sel-unary(node)
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2166
            "/              /
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2167
            "/             /
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2168
            "/           arg
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2169
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2170
            kwSels := findBest value:parentNode value:selector.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2171
            kwSels := kwSels select:[:sel | sel isKeywordSelector].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2172
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2173
            kwSels := kwSels asOrderedCollection sort:[:a :b | a size < b size].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2174
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2175
            bestSelectors := bestSelectors reject:[:sel | kwSels includes:sel].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2176
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2177
            "/ these need to go to bestSelectors (see editAction)
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2178
            parentNodeClassIfKnown := self classOfNode:parentNode.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2179
            (parentNodeClassIfKnown notNil and:[ parentNodeClassIfKnown includesBehavior: Boolean ]) ifTrue:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2180
                "/ this is so common, that it deserves a special case:
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2181
                "/ if we complete an if after some boolean message e.g '(a == b) if'
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2182
                "/ throw out the very unlikely ifNil, ifEmpty etc. messages (which are inherited by Object, but absolutely unrealistic)
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2183
                bestSelectors := self
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2184
                                    withoutSelectorsUnlikelyFor:parentNodeClassIfKnown
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2185
                                    from:bestSelectors
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2186
                                    forPartial:selector.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2187
                kwSels := self
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2188
                            withoutSelectorsUnlikelyFor:parentNodeClassIfKnown
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2189
                            from:kwSels
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2190
                            forPartial:selector.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2191
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2192
                "/ put keyword selectors in front, because they are very likely
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2193
                bestSelectors := kwSels , bestSelectors.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2194
            ] ifFalse:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2195
                "/ put them at the end
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2196
                bestSelectors := bestSelectors , kwSels.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2197
            ].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2198
        ]
4358
d9978bce6853 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4356
diff changeset
  2199
    ].
d9978bce6853 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4356
diff changeset
  2200
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2201
    (selector isUnarySelector
4375
305981eb7976 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4374
diff changeset
  2202
    and:[ node isMessage ]) ifTrue:[
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2203
        receiverNodeClassIfKnown := self classOfNode:nodeReceiver.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2204
        (receiverNodeClassIfKnown notNil and:[ receiverNodeClassIfKnown includesBehavior: Boolean ]) ifTrue:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2205
            "/ this is so common, that it deserves a special case:
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2206
            "/ if we complete an if after some boolean message e.g '(a == b) if'
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2207
            "/ throw out the very unlikely ifNil, ifEmpty etc. messages (which are inherited by Object, but absolutely unrealistic)
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2208
            bestSelectors := self
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2209
                                withoutSelectorsUnlikelyFor:receiverNodeClassIfKnown
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2210
                                from:bestSelectors
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2211
                                forPartial:selector.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2212
        ].
4375
305981eb7976 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4374
diff changeset
  2213
    ].
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2214
    (selector isUnarySelector
4416
ebb04dca4484 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4413
diff changeset
  2215
    and:[ parentNode notNil
ebb04dca4484 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4413
diff changeset
  2216
    and:[ parentNode isMessage
ebb04dca4484 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4413
diff changeset
  2217
    and:[ parentNode selector isKeyword ]]]) ifTrue:[
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2218
        "/ completing an already existing keyword message with somthing starting with
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2219
        "/ if, and, or or while.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2220
        "/ here, offer a special completion which inserts parenthesis / brackets around the already
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2221
        "/ existing message. Do this only, if the existing message makes sense.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2222
        ((
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2223
            #( 'ifTrue' 'ifFalse' 'and' 'or' 'whileTrue' 'whileFalse' )
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2224
        ) contains:[:part | part startsWith:selector]) ifTrue:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2225
            (Smalltalk allImplementorsOf:parentNode selector) notEmpty ifTrue:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2226
                |selsP selsB|
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2227
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2228
                selsP := #( 'ifTrue:' 'ifFalse:'  )
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2229
                            select:[:sel | sel startsWith:selector]
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2230
                            thenCollect:[:sel | '() ',sel].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2231
                selsB := #( 'whileTrue:' 'whileFalse:' )
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2232
                            select:[:sel | sel startsWith:selector]
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2233
                            thenCollect:[:sel | '[] ',sel].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2234
                bestSelectors3 := selsP , selsB.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2235
            ].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2236
        ].
4421
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  2237
    ] ifFalse:[
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2238
        "/ also offer adding brackets around a while expression
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2239
        (node receiver isBlock) ifFalse:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2240
            |sels|
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2241
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2242
            sels := #( 'whileTrue:' 'whileFalse:' )
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2243
                        select:[:sel | sel startsWith:selector]
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2244
                        thenCollect:[:sel | '[] ',sel].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2245
            bestSelectors3 := sels.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2246
        ].
4416
ebb04dca4484 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4413
diff changeset
  2247
    ].
4375
305981eb7976 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4374
diff changeset
  2248
4358
d9978bce6853 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4356
diff changeset
  2249
    allBest := (bestSelectors ? #()) , (bestSelectors2 ? #()).
4408
18567ee46c6a class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4407
diff changeset
  2250
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2251
    split :=
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2252
        [:list :splitHow |
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2253
            |part1 part2 all|
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2254
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2255
            part1 := list select:splitHow.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2256
            part2 := list reject:splitHow.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2257
            part1 isEmpty ifTrue:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2258
                all := part2.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2259
            ] ifFalse:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2260
                part2 isEmpty ifTrue:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2261
                    all := part1.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2262
                ] ifFalse:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2263
                    all := part1 , part2.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2264
                ]
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2265
            ].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2266
            all
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2267
        ].
4388
a2a5955d733c class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4387
diff changeset
  2268
    "/ sort: prefixes first.
a2a5955d733c class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4387
diff changeset
  2269
    selector2 notNil ifTrue:[
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2270
        allBest := split value:allBest value:[:sel | (sel startsWith:selector) or:[sel startsWith:selector2]].
4388
a2a5955d733c class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4387
diff changeset
  2271
    ].
4358
d9978bce6853 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4356
diff changeset
  2272
d9978bce6853 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4356
diff changeset
  2273
    "/ if receiver is super, always include the method's own selector
4408
18567ee46c6a class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4407
diff changeset
  2274
    nodeReceiver isSuper ifTrue:[
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2275
        (tree isMethod) ifTrue:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2276
            |mSel|
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2277
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2278
            mSel := tree selector.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2279
            mSel notNil ifTrue:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2280
                (mSel startsWith:selector) ifTrue:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2281
                    "/ already the word before the cursor?
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2282
                    (mSel ~= selector) ifTrue:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2283
                        allBest remove:mSel ifAbsent:[].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2284
                        allBest addFirst:mSel.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2285
                    ]
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2286
                ]
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2287
            ]
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2288
        ]
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2289
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2290
4416
ebb04dca4484 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4413
diff changeset
  2291
    allBest := (bestSelectors3 ? #()) , allBest.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2292
    allBest isEmptyOrNil ifTrue:[ ^ self ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2293
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2294
    selectorsSentInCode notNil ifTrue:[
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2295
        "/ the one's already sent in the code are moved to the top of the list.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2296
        allBest := split value:allBest value:[:sel | selectorsSentInCode includes:sel].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2297
    ].
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2298
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2299
    "/ the one's which are a prefix are moved towards the top of the list
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2300
    allBest := split value:allBest value:[:sel | sel notNil and:[sel startsWith:selector]].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2301
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2302
"/false ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2303
"/    srchClass notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2304
"/        implClass := srchClass whichClassIncludesSelector:best.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2305
"/    ] ifFalse:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2306
"/        implClass := Smalltalk allClasses select:[:cls | (cls includesSelector:best) or:[cls class includesSelector:best]].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2307
"/        implClass size == 1 ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2308
"/            implClass := implClass first.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2309
"/        ] ifFalse:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2310
"/            implClass := nil
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2311
"/        ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2312
"/    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2313
"/
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2314
"/    info := best storeString.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2315
"/    implClass notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2316
"/        info := implClass name , ' >> ' , info.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2317
"/    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2318
"/    self information:info.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2319
"/].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2320
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2321
    editAction :=
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2322
        [:index |
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2323
            |crsrPos chosen parentsToInsert|
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2324
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2325
            crsrPos := codeView characterPositionOfCursor.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2326
            chosen := allBest at:index.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2327
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2328
            chosen ~= selector ifTrue:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2329
                (bestSelectors3 notNil and:[bestSelectors3 includes:chosen]) ifTrue:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2330
                    parentsToInsert := chosen copyTo:2.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2331
                    chosen := chosen copyFrom:4.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2332
                ].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2333
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2334
                numArgs := chosen numArgs.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2335
                (bestSelectors2 notEmptyOrNil and:[bestSelectors2 includes:chosen]) ifTrue:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2336
                    selectorParts := parentNode selectorParts , node selectorParts.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2337
                ] ifFalse:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2338
                    selectorParts := node selectorParts.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2339
                ].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2340
                nSelParts := selectorParts size.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2341
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2342
                newParts := chosen asCollectionOfSubstringsSeparatedBy:$:.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2343
                newParts := newParts select:[:part | part size > 0].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2344
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2345
                codeView
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2346
                    undoableDo:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2347
                        |positionOfFirstArg newCursorPosition stop checkForArgumentTemplates
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2348
                         newPart oldPartialToken start|
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2349
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2350
                        checkForArgumentTemplates := (selector isUnarySelector and:[chosen isKeywordSelector]).
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2351
                        numArgs > nSelParts ifTrue:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2352
                            "/ new selector has more arguments; append them
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2353
                            stop := selectorParts last stop.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2354
                            codeView deleteFromCharacterPosition:stop+1 to:crsrPos-1.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2355
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2356
                            "/ append the rest ...
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2357
                            numArgs downTo:nSelParts+1 do:[:idx |
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2358
                                |newPart|
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2359
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2360
                                newPart := newParts at:idx.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2361
                                newPart := newPart , ':'.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2362
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2363
                                (codeView characterAtCharacterPosition:stop) == $: ifFalse:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2364
                                    newPart := ':' , newPart.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2365
                                ].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2366
                                newPart := (codeView characterAtCharacterPosition:stop) asString , newPart.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2367
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2368
                                codeView replaceFromCharacterPosition:stop to:stop with:newPart.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2369
                                "/ remember the leftMost replacement's end as new cursor position
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2370
                                newCursorPosition := stop + newPart size
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2371
                            ].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2372
                            checkForArgumentTemplates := true.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2373
                        ].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2374
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2375
                        "/ replace existing parts
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2376
                        (nSelParts min:newParts size) downTo:1 do:[:idx |
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2377
                            |skipColon|
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2378
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2379
                            skipColon := 0.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2380
                            newPart := newParts at:idx.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2381
                            oldPartialToken := selectorParts at:idx.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2382
                            start := oldPartialToken start.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2383
                            stop := oldPartialToken stop.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2384
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2385
                            (chosen endsWith:$:) ifTrue:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2386
                                (codeView characterAtCharacterPosition:stop+1) == $: ifFalse:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2387
                                    newPart := newPart , ':'.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2388
                                ] ifTrue:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2389
                                    skipColon := 1.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2390
                                ]
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2391
                            ] ifFalse:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2392
                                (codeView characterAtCharacterPosition:stop) == $: ifTrue:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2393
                                    newPart := newPart , ':'
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2394
                                ] ifFalse:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2395
                                    |nextChar|
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2396
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2397
                                    nextChar := codeView characterAtCharacterPosition:stop+1.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2398
                                    nextChar isSeparator ifFalse:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2399
                                        nextChar == $. ifFalse:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2400
                                            newPart := newPart , ' '
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2401
                                        ].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2402
                                    ]
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2403
                                ]
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2404
        "/                            codeView replaceFromCharacterPosition:start to:stop with:(newPart , ':').
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2405
        "/                        ] ifFalse:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2406
        "/                            codeView replaceFromCharacterPosition:start to:stop with:newPart.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2407
                            ].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2408
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2409
                            oldPartialToken value ~= newPart ifTrue:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2410
                                codeView replaceFromCharacterPosition:start to:stop with:newPart.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2411
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2412
                                oldLen := stop - start + 1.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2413
                                newLen := newPart size.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2414
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2415
                                "/ codeView selectFromCharacterPosition:start+oldLen to:start+newLen-1.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2416
                                "/ remember the leftMost replacement's end as new cursor position
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2417
                                newCursorPosition := start + newPart size + skipColon. "/ (newLen-oldLen) + 1.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2418
                                "/ codeView cursorToCharacterPosition:newCursorPosition.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2419
                            ].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2420
                        ].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2421
                        newCursorPosition notNil ifTrue:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2422
                            codeView cursorToCharacterPosition:newCursorPosition-1.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2423
                            codeView cursorRight.  "/ avoid going to the next line !!
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2424
                        ].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2425
                        codeView dontReplaceSelectionOnInput.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2426
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2427
                        checkForArgumentTemplates ifTrue:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2428
                            "/ add opening brackets, etc.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2429
                            self insertAdditonalStuffAfterSelector:chosen.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2430
                        ].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2431
                        parentsToInsert notNil ifTrue:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2432
                            |sav|
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2433
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2434
                            sav := codeView characterPositionOfCursor-1.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2435
                            codeView insertString:(parentsToInsert copyLast:1) atCharacterPosition:node receiver stop+1.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2436
                            codeView insertString:(parentsToInsert copyFirst:1) atCharacterPosition:parentNode start.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2437
                            codeView cursorToCharacterPosition:sav+2; cursorRight
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2438
                        ].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2439
                    ]
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2440
                info:'Completion'.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2441
            ].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2442
        ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2443
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2444
    actionBlock value:allBest value:editAction value:nil.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2445
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2446
    "Created: / 10-11-2006 / 13:18:27 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2447
    "Modified: / 16-02-2010 / 10:33:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
4444
17e98954dad5 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4442
diff changeset
  2448
    "Modified: / 06-11-2013 / 16:40:51 / cg"
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2449
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2450
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2451
codeCompletionForMethodSpec:node
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2452
    "completion in a method's selector pattern"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2453
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2454
    self
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2455
	codeCompletionForMethodSpec:node
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2456
	into:
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2457
	    [:suggestions :action :whatIsIt |
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2458
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2459
	    |chosen|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2460
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2461
	    chosen := self askUserForCompletion:whatIsIt for:codeView
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2462
			   at:node start from:suggestions.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2463
	    chosen notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2464
		action value:(suggestions indexOf:chosen)
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2465
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2466
	].
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2467
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2468
"/    |crsrPos
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2469
"/     selectorSoFar matchingSelectors
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2470
"/     selectors distances best rest
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2471
"/     allExistingMethods nameBag namesByCount selectors1 selectors2|
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2472
"/
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2473
"/    crsrPos := codeView characterPositionOfCursor - 1.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2474
"/
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2475
"/    selectorSoFar := ''.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2476
"/    node selectorParts doWithIndex:[:partToken :argNr|
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2477
"/        |part|
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2478
"/
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2479
"/        part := partToken value.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2480
"/        selectorSoFar := selectorSoFar , part.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2481
"/
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2482
"/        (crsrPos >= partToken start
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2483
"/        and:[crsrPos <= partToken stop]) ifTrue:[
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2484
"/            (classOrNil notNil and:[classOrNil isMeta]) ifTrue:[
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2485
"/                matchingSelectors := Smalltalk allClasses
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2486
"/                                    inject:(Set new)
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2487
"/                                    into:[:theSet :eachClass |
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2488
"/                                        |md|
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2489
"/
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2490
"/                                        md := eachClass theMetaclass methodDictionary.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2491
"/                                        theSet addAll:(md keys select:[:sel |sel startsWith:selectorSoFar]).
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2492
"/                                        theSet.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2493
"/                                    ].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2494
"/                "/ dont forget the stuff in the class-line
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2495
"/                Metaclass withAllSuperclassesDo:[:cls |
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2496
"/                    matchingSelectors addAll:(cls methodDictionary keys select:[:sel |sel startsWith:selectorSoFar]).
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2497
"/                ].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2498
"/            ] ifFalse:[
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2499
"/                matchingSelectors := Smalltalk allClasses
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2500
"/                                    inject:(Set new)
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2501
"/                                    into:[:theSet :eachClass |
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2502
"/                                        |md|
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2503
"/
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2504
"/                                        md := eachClass theNonMetaclass methodDictionary.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2505
"/                                        theSet addAll:(md keys select:[:sel |sel startsWith:selectorSoFar]).
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2506
"/                                        theSet.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2507
"/                                    ].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2508
"/            ].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2509
"/            selectors := matchingSelectors asOrderedCollection.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2510
"/
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2511
"/            "/ if there is only one, and user has already entered it, he might want to complete the argument-name
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2512
"/            (selectors size == 1
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2513
"/            and:[selectors first = selectorSoFar]) ifTrue:[
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2514
"/                selectorSoFar numArgs == 0 ifTrue:[ ^ self ].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2515
"/
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2516
"/                allExistingMethods := (Smalltalk allImplementorsOf:selectorSoFar asSymbol)
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2517
"/                                        collect:[:cls | cls compiledMethodAt:selectorSoFar asSymbol].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2518
"/                nameBag := Bag new.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2519
"/                allExistingMethods do:[:eachMethod | nameBag addAll:(eachMethod methodArgNames ? #())].
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2520
"/                namesByCount := nameBag valuesAndCounts sort:[:a :b | a value < b value].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2521
"/                "/ take the one which occurs most often
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2522
"/                best := self askUserForCompletion:'argument' for:codeView at: node start from:(namesByCount collect:[:a | a key]).
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2523
"/
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2524
"/                codeView
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2525
"/                    undoableDo:[
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2526
"/                        (crsrPos+1) >= codeView contents size ifTrue:[
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2527
"/                            codeView paste:best.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2528
"/                        ] ifFalse:[
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2529
"/                            codeView insertString:best atCharacterPosition:crsrPos+1.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2530
"/                        ]
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2531
"/                    ]
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2532
"/                    info:'completion'.
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2533
"/                codeView cursorToCharacterPosition:(crsrPos + best size - 1).
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2534
"/            ] ifFalse:[
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2535
"/                "the ones implemented in superclasses are shown first"
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2536
"/                classOrNil notNil ifTrue:[
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2537
"/                    selectors1 := selectors select:[:sel | classOrNil respondsTo:sel].  "/ in super
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2538
"/                    selectors2 := selectors reject:[:sel | selectors1 includes:sel ].   "/ not in super
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2539
"/                ] ifFalse:[
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2540
"/                    selectors1 := selectors
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2541
"/                ].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2542
"/
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2543
"/                distances := selectors1 collect:[:each | each spellAgainst:selectorSoFar].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2544
"/                distances sortWith:selectors1.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2545
"/                selectors1 reverse.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2546
"/                selectors := selectors1.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2547
"/
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2548
"/                selectors2 notEmptyOrNil ifTrue:[
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2549
"/                    distances := selectors2 collect:[:each | each spellAgainst:selectorSoFar].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2550
"/                    distances sortWith:selectors2.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2551
"/                    selectors2 reverse.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2552
"/                    selectors1 := selectors1 collect:[:sel | sel allBold].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2553
"/                    selectors := selectors1,selectors2.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2554
"/                ].
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2555
"/
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2556
"/                best := self askUserForCompletion:'selector' for:codeView at:(node start) from:selectors.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2557
"/                best isNil ifTrue:[^ self].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2558
"/
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2559
"/                rest := best copyFrom:selectorSoFar size.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2560
"/                codeView
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2561
"/                    undoableDo:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2562
"/                        codeView
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2563
"/                            replaceFromCharacterPosition:crsrPos+1
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2564
"/                            to:crsrPos+1
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2565
"/                            with:rest
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2566
"/                    ]
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2567
"/                    info:'Completion'.
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2568
"/                codeView cursorToCharacterPosition:(crsrPos+1 + rest size - 1).
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2569
"/            ].
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2570
"/            codeView cursorRight. "/ kludge to make it visible
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2571
"/        ].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2572
"/    ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2573
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2574
    "Modified: / 04-07-2006 / 18:48:26 / fm"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2575
    "Created: / 10-11-2006 / 13:46:44 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2576
    "Modified: / 16-02-2010 / 10:13:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2577
    "Modified: / 01-06-2012 / 20:31:36 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2578
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2579
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2580
codeCompletionForMethodSpec:node into:actionBlock
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2581
    "completion in a method's selector pattern"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2582
4370
2569507c08b9 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4369
diff changeset
  2583
    |crsrPos crsrLine crsrCol
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2584
     selectorSoFar matchingSelectors
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2585
     selectors distances best rest
4437
f20ff8e2ab34 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4436
diff changeset
  2586
     allExistingMethods nameBag namesByCount selectors1 selectors2 selectors0
4691
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2587
     editAction argNames selectorsForVars
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2588
     selectorTypedSoFar|
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2589
4437
f20ff8e2ab34 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4436
diff changeset
  2590
    selectors := OrderedCollection new.
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2591
    selectors0 := OrderedCollection new.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2592
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2593
    "/ Transcript showCR:'m'.
4370
2569507c08b9 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4369
diff changeset
  2594
    crsrLine := codeView cursorLine.
2569507c08b9 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4369
diff changeset
  2595
    crsrCol := codeView cursorCol.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2596
    crsrPos := codeView characterPositionOfCursor - 1.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2597
4691
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2598
    selectorTypedSoFar := node selector.
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2599
    selectorTypedSoFar isUnarySelector ifTrue:[
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2600
        "/ user has just begun to edit a selector.
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2601
        "/ often, a good completion are the names of instVars for which no corresponding getter/setter exists
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2602
        classOrNil notNil ifTrue:[
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2603
            selectorsForVars := OrderedCollection new.
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2604
            classOrNil instVarNames do:[:nm |
4691
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2605
                (nm startsWith:selectorTypedSoFar) ifTrue:[
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2606
                    (classOrNil implements:nm asSymbol) ifFalse:[ selectorsForVars add:nm].
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2607
                    (classOrNil implements:nm asMutator) ifFalse:[ selectorsForVars add:(nm,':')].
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2608
                 ]
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2609
            ].
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2610
            classOrNil isMeta ifTrue:[
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2611
                classOrNil theNonMetaclass classVarNames do:[:nm |
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2612
                    |nmSel|
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2613
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2614
                    nmSel := nm asLowercaseFirst.
4691
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2615
                    (nmSel startsWith:selectorTypedSoFar) ifTrue:[
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2616
                        (classOrNil implements:nmSel asSymbol) ifFalse:[ selectorsForVars add:nmSel].
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2617
                        (classOrNil implements:nmSel asMutator) ifFalse:[ selectorsForVars add:(nmSel,':')].
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2618
                     ]
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2619
                ].
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2620
            ] ifFalse:[
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2621
                "/ isXXX ?
4691
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2622
                (('is',classOrNil nameWithoutPrefix) startsWith:selectorTypedSoFar ) ifTrue:[
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2623
                    selectors0 add:('is',classOrNil nameWithoutPrefix).
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2624
                ].
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2625
            ].
4691
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2626
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2627
            "/ and also messages sent by the class itself
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2628
            classOrNil methodsDo:[:m |
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2629
                m messagesSentToSelf do:[:sel |
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2630
                    (sel startsWith:selectorTypedSoFar) ifTrue:[
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2631
                        (classOrNil implements:sel) ifFalse:[ selectorsForVars add:sel].
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2632
                    ]                     
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2633
                ]
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2634
            ].
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2635
            classOrNil isMeta ifFalse:[
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2636
                classOrNil theMetaclass methodsDo:[:m |
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2637
                    m messagesSent do:[:sel |
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2638
                        (sel startsWith:selectorTypedSoFar) ifTrue:[
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2639
                            (classOrNil implements:sel) ifFalse:[ selectorsForVars add:sel].
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2640
                        ]                     
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2641
                    ]                     
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2642
                ]
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2643
            ].
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2644
        ].
4371
95c3d2ba35d5 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4370
diff changeset
  2645
    ].
95c3d2ba35d5 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4370
diff changeset
  2646
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2647
    selectorSoFar := ''.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2648
    node selectorParts doWithIndex:[:partToken :argNr|
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2649
        |part|
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2650
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2651
        part := partToken value.
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2652
        selectorSoFar := selectorSoFar , part.
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2653
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2654
        (crsrPos >= partToken start
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2655
        and:[crsrPos <= partToken stop]) ifTrue:[
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2656
            (classOrNil notNil and:[classOrNil isMeta]) ifTrue:[
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2657
                matchingSelectors := Smalltalk allClasses
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2658
                                    inject:(Set new)
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2659
                                    into:[:theSet :eachClass |
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2660
                                        |md|
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2661
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2662
                                        md := eachClass theMetaclass methodDictionary.
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2663
                                        theSet addAll:(md keys select:[:sel |sel startsWith:selectorSoFar]).
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2664
                                        theSet.
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2665
                                    ].
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2666
                "/ dont forget the stuff in the class-line
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2667
                Metaclass withAllSuperclassesDo:[:cls |
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2668
                    matchingSelectors addAll:(cls methodDictionary keys select:[:sel |sel startsWith:selectorSoFar]).
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2669
                ].
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2670
            ] ifFalse:[
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2671
                matchingSelectors := Smalltalk allClasses
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2672
                                    inject:(Set new)
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2673
                                    into:[:theSet :eachClass |
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2674
                                        |md|
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2675
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2676
                                        md := eachClass theNonMetaclass methodDictionary.
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2677
                                        theSet addAll:(md keys select:[:sel |sel startsWith:selectorSoFar]).
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2678
                                        theSet.
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2679
                                    ].
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2680
            ].
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2681
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2682
            selectors addAll:matchingSelectors.
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2683
            selectorsForVars notNil ifTrue:[ selectors addAll:selectorsForVars ].
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2684
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2685
            selectors := selectors sort:[:a :b | a size < b size].
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2686
            selectors size > 100 ifTrue:[
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2687
                selectors := selectors copyTo:100.
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2688
            ].
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2689
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2690
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2691
            "/ if there is only one, and user has already entered it, 
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2692
            "/ he might want to complete the argument-name
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2693
            (selectors size == 1
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2694
            and:[selectors first = selectorSoFar]) ifTrue:[
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2695
                selectorSoFar numArgs == 0 ifTrue:[ ^ self ].
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2696
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2697
                allExistingMethods := (Smalltalk allImplementorsOf:selectorSoFar asSymbol)
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2698
                                        collect:[:cls | cls compiledMethodAt:selectorSoFar asSymbol].
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2699
                nameBag := Bag new.
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2700
                allExistingMethods do:[:eachMethod | nameBag addAll:(eachMethod methodArgNames ? #())].
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2701
                namesByCount := nameBag valuesAndCounts sort:[:a :b | a value < b value].
4784
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  2702
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2703
                "/ take the one which occurs most often
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2704
                "/ best := self askUserForCompletion:'argument' for:codeView at: node start from:(namesByCount collect:[:a | a key]).
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2705
                argNames := (namesByCount collect:[:a | a key]).
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2706
                editAction :=
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2707
                        [:chosenIndex |
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2708
                            |chosenName|
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2709
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2710
                            chosenName := argNames at:chosenIndex.
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2711
                            codeView
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2712
                                undoableDo:[
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2713
                                    (crsrPos+1) >= codeView contents size ifTrue:[
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2714
                                        codeView paste:chosenName.
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2715
                                        codeView cursorToCharacterPosition:(crsrPos + chosenName size - 1).
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2716
                                    ] ifFalse:[
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2717
                                        codeView cursorToCharacterPosition:crsrPos.
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2718
                                        codeView cursorRight.
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2719
                                        codeView insertStringAtCursor:chosenName.
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2720
                                        codeView selectFromCharacterPosition:crsrPos+1 to:crsrPos+1+chosenName size-1.
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2721
                                        codeView dontReplaceSelectionOnInput
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2722
                                    ].
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2723
                                ]
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2724
                                info:'completion'.
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2725
                        ].
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2726
                actionBlock
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2727
                    value:argNames
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2728
                    value:editAction
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2729
                    value:'argument'.
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2730
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2731
                ^ self.
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2732
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2733
            ].
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2734
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2735
            "the ones implemented in superclasses are shown first"
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2736
            classOrNil notNil ifTrue:[
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2737
                selectors1 := selectors select:[:sel | classOrNil respondsTo:sel].  "/ in super
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2738
                selectors2 := selectors reject:[:sel | selectors1 includes:sel ].   "/ not in super
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2739
            ] ifFalse:[
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2740
                selectors1 := selectors
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2741
            ].
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2742
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2743
            distances := selectors1 collect:[:each | each spellAgainst:selectorSoFar].
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2744
            distances sortWith:selectors1.
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2745
            selectors1 reverse.
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2746
            selectors := selectors1.
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2747
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2748
            selectors2 notEmptyOrNil ifTrue:[
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2749
                distances := selectors2 collect:[:each | each spellAgainst:selectorSoFar].
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2750
                distances sortWith:selectors2.
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2751
                selectors2 reverse.
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2752
                selectors1 := selectors1 collect:[:sel | sel allBold].
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2753
                selectors := selectors1,selectors2.
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2754
            ].
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2755
            selectors0 notEmptyOrNil ifTrue:[
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2756
                selectors := selectors0,selectors.
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2757
            ].
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2758
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2759
            editAction :=
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2760
                [:selectedCompletionIndex |
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2761
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2762
                    best := selectors at:selectedCompletionIndex.
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2763
                    rest := best copyFrom:selectorSoFar size + 1.
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2764
                    codeView
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2765
                        undoableDo:[
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2766
                            codeView insertString:rest atLine:crsrLine col:crsrCol.
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2767
                        ]
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2768
                        info:'Completion'.
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2769
                    codeView cursorToCharacterPosition:(crsrPos+1 + rest size - 1).
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2770
                    codeView cursorRight. "/ kludge to make it visible
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2771
                ].
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2772
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2773
            "/ best := self askUserForCompletion:'selector' for:codeView at:(node start) from:selectors.
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2774
            actionBlock
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2775
                value:selectors
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2776
                value:editAction
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2777
                value:'selector'.
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2778
        ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2779
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2780
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2781
    "Modified: / 04-07-2006 / 18:48:26 / fm"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2782
    "Created: / 10-11-2006 / 13:46:44 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2783
    "Modified: / 16-02-2010 / 10:13:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2784
    "Modified: / 01-06-2012 / 20:31:36 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2785
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2786
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2787
codeCompletionForVariable:node into:actionBlock
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2788
    |nonMetaClass crsrPos nm parent
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2789
     allVariables allDistances variablesAlreadyAdded nodeVal
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2790
     char oldLen newLen
4485
c6ed849af389 class: DoWhatIMeanSupport
Stefan Vogel <sv@exept.de>
parents: 4484
diff changeset
  2791
     getDistanceComputeBlockWithWeight addWithFactorBlock allTheBest bestAssoc
4366
8041b628bba3 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4365
diff changeset
  2792
     globalFactor localFactor selectorOfMessageToNode implementors argIdx namesUsed kwPart
4620
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  2793
     editAction suggestions nameIsOK longerNames setOfNames otherArgNames
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  2794
     suggestionsWithInfo|
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2795
4302
f115f2ff999d class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4301
diff changeset
  2796
    "/ Transcript show:'var in '; show:methodOrNil; show:' / '; showCR:classOrNil.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2797
    classOrNil notNil ifTrue:[
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2798
        nonMetaClass := classOrNil theNonMetaclass.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2799
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2800
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2801
    nm := node name.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2802
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2803
    "/ if we are behind the variable and a space has already been entered,
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2804
    "/ the user is probably looking for a message selector.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2805
    "/ If the variable represents a global, present its instance creation messages
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2806
    crsrPos := codeView characterPositionOfCursor.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2807
    char := codeView characterAtCharacterPosition:crsrPos-1.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2808
    char isSeparator ifTrue:[
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2809
        nm knownAsSymbol ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2810
            classOrNil isNil ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2811
                nodeVal := Smalltalk at:nm asSymbol.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2812
            ] ifFalse:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2813
                nodeVal := classOrNil topNameSpace at:nm asSymbol ifAbsent:[Smalltalk at:nm asSymbol].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2814
            ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2815
            nodeVal isBehavior ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2816
                |methods selectors menu exitKey idx|
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2817
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2818
                methods := nodeVal class methodDictionary values
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2819
                                select:[:m | |cat|
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2820
                                    cat := m category asLowercase.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2821
                                    cat = 'instance creation'
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2822
                                ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2823
                selectors := methods collect:[:each | each selector].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2824
                editAction :=
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2825
                    [:answer |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2826
                        |s|
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2827
                        s := answer isInteger ifTrue:[selectors at:answer] ifFalse:[answer].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2828
                        codeView
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2829
                            undoableDo:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2830
                                codeView insertString:s atCharacterPosition:crsrPos.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2831
                                codeView cursorToCharacterPosition:crsrPos+s size.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2832
                            ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2833
                            info:'completion'.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2834
                    ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2835
                actionBlock
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2836
                    value:selectors
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2837
                    value:editAction
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2838
                    value:nil.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2839
                ^ self.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2840
            ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2841
        ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2842
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2843
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2844
    parent := node parent.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2845
    (parent notNil and:[parent isMessage]) ifTrue:[
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2846
        node == parent receiver ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2847
            selectorOfMessageToNode := parent selector
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2848
        ]
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2849
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2850
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2851
    "/ this is pure voodoo magic (tries to make a good spelling weight,
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2852
    "/ by weighting the number of startsWith characters into the spelling distance...)
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2853
    getDistanceComputeBlockWithWeight :=
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2854
        [:weight |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2855
            [:each |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2856
                |dist factor|
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2857
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2858
                dist := each spellAgainst:nm.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2859
                factor := 1.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2860
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2861
                (each startsWith:nm) ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2862
                    factor := 6 * nm size.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2863
                ] ifFalse:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2864
                    (each asLowercase startsWith:nm asLowercase) ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2865
                        factor := 4 * nm size.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2866
                    ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2867
                ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2868
                dist := dist + (weight*factor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2869
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2870
                each -> (dist * weight)
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2871
             ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2872
        ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2873
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2874
    nameIsOK := false.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2875
    addWithFactorBlock :=
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2876
        [:eachNames :factor |
4689
2e20580b6878 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4665
diff changeset
  2877
            |distanceComputeBlock|
2e20580b6878 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4665
diff changeset
  2878
2e20580b6878 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4665
diff changeset
  2879
            distanceComputeBlock := (getDistanceComputeBlockWithWeight value:factor).
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2880
            (eachNames includes:nm) ifTrue:[nameIsOK := true].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2881
            eachNames do:[:nameToAdd |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2882
                (nameToAdd ~= nm) ifTrue:[  "/ not again
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2883
                    (variablesAlreadyAdded includes:nameToAdd) ifFalse:[  "/ not again
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2884
                        variablesAlreadyAdded add:nameToAdd.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2885
                        allVariables add:nameToAdd.
4689
2e20580b6878 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4665
diff changeset
  2886
                        allDistances add:(distanceComputeBlock value:nameToAdd).
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2887
                    ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2888
                ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2889
            ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2890
        ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2891
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2892
    nm isUppercaseFirst ifTrue:[
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2893
        globalFactor := 2.    "/ favour globals
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2894
        localFactor := 1.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2895
    ] ifFalse:[
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2896
        globalFactor := 1.    "/ favour locals
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2897
        localFactor := 2.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2898
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2899
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2900
    variablesAlreadyAdded := Set new.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2901
    allVariables := OrderedCollection new.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2902
    allDistances := OrderedCollection new.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2903
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2904
    "/ are we in the method's selector spec ?
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2905
    (parent notNil
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2906
    and:[parent isMethod
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2907
    and:[parent arguments includes:node]]) ifTrue:[
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2908
        "/ yes -
4784
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  2909
        "/ now that's cool: look how the name of this argument is in other implementations
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2910
        "/ of this method, and take that as a basis of the selection
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2911
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2912
        implementors := SystemBrowser
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2913
                            findImplementorsOf:(parent selector)
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2914
                            in:(Smalltalk allClasses)
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2915
                            ignoreCase:false.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2916
        "/ which argument is it
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2917
        argIdx := parent arguments indexOf:node.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2918
        implementors size > 50 ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2919
            implementors := implementors asOrderedCollection copyTo:50.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2920
        ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2921
        namesUsed := implementors
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2922
                        collect:[:eachImplementor |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2923
                            |parseTree|
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2924
                            parseTree := eachImplementor parseTree.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2925
                            (parseTree notNil and:[parseTree arguments size > 0])
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2926
                                ifFalse:nil
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2927
                                ifTrue:[ (parseTree arguments at:argIdx) name] ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2928
                        thenSelect:[:a | a notNil].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2929
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2930
        addWithFactorBlock value:namesUsed value:(2 * localFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2931
4784
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  2932
        "/ try some commonly used arg names, such as aBoolean, anInteger, etc.
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  2933
        nm size > 1 ifTrue:[
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  2934
            |tryClassNamesWith|
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  2935
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  2936
            ((nm startsWith:'a') and:[(nm at:2) isUppercase]) ifTrue:[
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  2937
                tryClassNamesWith := 'a'
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  2938
            ] ifFalse:[
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  2939
                (nm size > 2 and:[ (nm startsWith:'an') and:[(nm at:3) isUppercase]]) ifTrue:[
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  2940
                    tryClassNamesWith := 'an'.
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  2941
                ].
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  2942
            ].
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  2943
            tryClassNamesWith notNil ifTrue:[
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  2944
                addWithFactorBlock 
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  2945
                    value:(Smalltalk keys 
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  2946
                            collect:[:className | tryClassNamesWith,className]
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  2947
                            thenSelect:[:name | name startsWith:nm])
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  2948
                    value:(1.5 * localFactor)
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  2949
            ].
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  2950
        ].
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  2951
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2952
        classOrNil notNil ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2953
            "/ also, look for the keyword before the argument,
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2954
            "/ and see if there is such an instVar
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2955
            "/ if so, add it with -Arg
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2956
            parent selector isKeyword ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2957
                kwPart := parent selector keywords at:argIdx.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2958
                (classOrNil allInstVarNames includes:(kwPart copyButLast:1)) ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2959
                    addWithFactorBlock
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2960
                        value:(classOrNil allInstVarNames collect:[:nm| nm,'Arg'])
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2961
                        value:(1 * localFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2962
                ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2963
            ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2964
            "/ look for the variable names of any other method in that class
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2965
            otherArgNames := Set new.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2966
            classOrNil methodDictionary keysAndValuesDo:[:sel :mthd |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2967
                            |parseTree|
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2968
                            parseTree := mthd parseTree.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2969
                            (parseTree notNil and:[parseTree arguments size > 0])
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2970
                                ifFalse:nil
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2971
                                ifTrue:[ otherArgNames addAll:(parseTree arguments collect:[:each | each name])] ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2972
            addWithFactorBlock value:otherArgNames value:(1.5 * localFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2973
        ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2974
        addWithFactorBlock value:(codeView previousReplacements collect:[:p | p value asString]) value:(1.3 * localFactor).
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2975
    ] ifFalse:[
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2976
        "/ locals in the block/method
4780
ac7e1d23c65b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4775
diff changeset
  2977
        |names  nameSpace|
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2978
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2979
        names := OrderedCollection withAll:node allVariablesOnScope.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2980
        setOfNames := Set withAll:names.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2981
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2982
        rememberedScopeNodes notNil ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2983
            "/ notNil when a parseError occurred.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2984
            rememberedScopeNodes do:[:eachScope |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2985
                (eachScope isMethod or:[eachScope isBlock]) ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2986
                    eachScope argumentNames do:[:eachName |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2987
                        (setOfNames includes:eachName) ifFalse:[ names add:eachName. setOfNames add:eachName ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2988
                    ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2989
                ] ifFalse:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2990
                    eachScope isSequence ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2991
                        eachScope temporaryNames do:[:eachName |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2992
                            (setOfNames includes:eachName) ifFalse:[ names add:eachName. setOfNames add:eachName ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2993
                        ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2994
                    ] ifFalse:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2995
                    ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2996
                ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2997
                "/ (setOfNames includesAll:(eachScope allDefinedVariables)) ifFalse:[ self halt].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2998
            ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  2999
            rememberedScopeNodes do:[:eachScope |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3000
                eachScope variableNodesDo:[:var |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3001
                    (setOfNames includes:var name) ifFalse:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3002
                        names add:var name. setOfNames add:var name
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3003
                    ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3004
                ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3005
            ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3006
        ] ifFalse:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3007
            "/ tree must be there
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3008
            tree variableNodesDo:[:var |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3009
                (setOfNames includes:var name) ifFalse:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3010
                    names add:var name. setOfNames add:var name
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3011
                ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3012
            ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3013
        ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3014
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3015
        addWithFactorBlock value:names value:(4 * localFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3016
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3017
        classOrNil notNil ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3018
            "/ instance variables
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3019
            addWithFactorBlock value:classOrNil instVarNames value:(3 * localFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3020
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3021
            "/ inherited instance variables
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3022
            classOrNil superclass notNil ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3023
                addWithFactorBlock value:classOrNil superclass allInstVarNames value:(2.5 * localFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3024
            ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3025
        ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3026
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3027
        "/ magic:
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3028
        "/ if the node to be expanded is the receiver in a message, look for the selector sent to it
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3029
        "/ give names which respond to those messages a higher weight
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3030
        selectorOfMessageToNode notNil ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3031
            |responders nonResponders|
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3032
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3033
            "/ responding to that messsage
4365
fda4ed5a9772 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4364
diff changeset
  3034
"/ self halt.
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3035
            classOrNil notNil ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3036
                "/ private classes
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3037
                addWithFactorBlock value:(nonMetaClass privateClasses collect:[:cls | cls nameWithoutPrefix])
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3038
                                   value:(2.75 * globalFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3039
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3040
                "/ class variables
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3041
                names := nonMetaClass classVarNames.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3042
                responders := names select:[:classVar | (nonMetaClass classVarAt:classVar) respondsTo:selectorOfMessageToNode].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3043
                nonResponders := names reject:[:classVar | (nonMetaClass classVarAt:classVar) respondsTo:selectorOfMessageToNode].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3044
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3045
                addWithFactorBlock value:responders value:(3.0 * globalFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3046
                addWithFactorBlock value:nonResponders value:(0.5 * 1.5 * globalFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3047
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3048
                "/ superclass var names
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3049
                nonMetaClass allSuperclassesDo:[:superClass |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3050
                    names := superClass classVarNames.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3051
                    responders := names select:[:classVar | (superClass classVarAt:classVar) respondsTo:selectorOfMessageToNode].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3052
                    nonResponders := names reject:[:classVar | (superClass classVarAt:classVar) respondsTo:selectorOfMessageToNode].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3053
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3054
                    addWithFactorBlock value:responders value:(2.75 * globalFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3055
                    addWithFactorBlock value:nonResponders value:(0.5 * 1 * globalFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3056
                ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3057
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3058
                "/ namespace vars
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3059
                classOrNil topNameSpace ~~ Smalltalk ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3060
                    names := classOrNil topNameSpace keys.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3061
                    names := names reject:[:nm | nm includes:$:].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3062
                    names := names select:[:nm | nm isUppercaseFirst ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3063
                    responders := names select:[:nsVar | |c| c := classOrNil topNameSpace at:nsVar. c isBehavior not or:[c isLoaded and:[c respondsTo:selectorOfMessageToNode]]].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3064
                    nonResponders := names reject:[:nsVar | |c| c := classOrNil topNameSpace at:nsVar. c isBehavior not or:[c isLoaded and:[c respondsTo:selectorOfMessageToNode]]].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3065
                    addWithFactorBlock value:responders value:(2.5 * globalFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3066
                    addWithFactorBlock value:nonResponders value:(0.5 * 1.5 * globalFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3067
                ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3068
            ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3069
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3070
            "/ globals
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3071
            names := Smalltalk keys.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3072
            names := names reject:
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3073
                            [:nm |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3074
                                (nm includes:$:) and:[ (Smalltalk at:nm) isBehavior not]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3075
                            ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3076
            names := names reject:[:nm | nm startsWith:'Undeclared:::' ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3077
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3078
            names := names select:[:nm | nm isUppercaseFirst ] as:OrderedCollection.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3079
            responders := names select:[:glblVar | |c| c := Smalltalk at:glblVar. c isBehavior not or:[c isLoaded and:[c respondsTo:selectorOfMessageToNode]]].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3080
            nonResponders := names reject:[:glblVar | |c| c := Smalltalk at:glblVar. c isBehavior not or:[c isLoaded and:[c respondsTo:selectorOfMessageToNode]]].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3081
            addWithFactorBlock value:responders value:(1.5 * globalFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3082
            addWithFactorBlock value:nonResponders value:(0.5 * 1.5 * globalFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3083
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3084
            classOrNil notNil ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3085
                "/ pool variables
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3086
                classOrNil theNonMetaclass sharedPoolNames do:[:poolName |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3087
                    |pool names|
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3088
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3089
                    pool := Smalltalk at:poolName.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3090
                    names := pool classVarNames.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3091
                    names := names select:[:nm | nm isUppercaseFirst ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3092
                    responders := names select:[:glblVar | |c| c := Smalltalk at:glblVar. c isBehavior not or:[c isLoaded and:[c respondsTo:selectorOfMessageToNode]]].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3093
                    nonResponders := names reject:[:glblVar | |c| c := Smalltalk at:glblVar. c isBehavior not or:[c isLoaded and:[c respondsTo:selectorOfMessageToNode]]].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3094
                    addWithFactorBlock value:responders value:(2.5 * globalFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3095
                    addWithFactorBlock value:nonResponders value:(0.5 * 2.5 * globalFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3096
                ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3097
            ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3098
        ] ifFalse:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3099
            classOrNil notNil ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3100
                "/ private classes
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3101
                addWithFactorBlock value:(nonMetaClass privateClasses collect:[:cls | cls nameWithoutPrefix])
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3102
                                   value:(2.75 * globalFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3103
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3104
                "/ class variables
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3105
                addWithFactorBlock value:nonMetaClass classVarNames value:(3.0 * globalFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3106
                nonMetaClass superclass notNil ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3107
                    addWithFactorBlock value:nonMetaClass superclass allClassVarNames value:(2.5 * globalFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3108
                ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3109
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3110
                "/ namespace vars
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3111
                classOrNil topNameSpace ~~ Smalltalk ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3112
                    names := classOrNil topNameSpace keys.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3113
                    names := names reject:[:nm | nm includes:$:].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3114
                    names := names select:[:nm | nm isUppercaseFirst ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3115
                    addWithFactorBlock value:names value:(2.5 * globalFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3116
                ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3117
                "/ namespace vars
4780
ac7e1d23c65b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4775
diff changeset
  3118
                ((nameSpace := classOrNil nameSpace) notNil and:[nameSpace ~~ Smalltalk]) ifTrue:[
ac7e1d23c65b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4775
diff changeset
  3119
                    names := nameSpace isNameSpace ifTrue:[nameSpace keys] ifFalse:[nameSpace privateClasses collect:[:c | c nameWithoutPrefix]].
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3120
                    names := names select:[:nm | nm isUppercaseFirst ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3121
                    names := names reject:[:nm | nm includes:$:].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3122
                    addWithFactorBlock value:names value:(2.5 * globalFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3123
                ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3124
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3125
                "/ pool variables
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3126
                classOrNil theNonMetaclass sharedPoolNames do:[:poolName |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3127
                    |pool names|
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3128
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3129
                    pool := Smalltalk at:poolName.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3130
                    pool isNil ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3131
                        Transcript showCR:'non existent pool: ',poolName
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3132
                    ] ifFalse:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3133
                        names := pool classVarNames.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3134
                        addWithFactorBlock value:names value:(2.5 * globalFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3135
                    ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3136
                ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3137
            ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3138
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3139
            "/ globals
4665
260b9fd17388 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4620
diff changeset
  3140
            names := OrderedCollection new.
260b9fd17388 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4620
diff changeset
  3141
            Smalltalk keysDo:[:k |
260b9fd17388 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4620
diff changeset
  3142
                (k isUppercaseFirst
260b9fd17388 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4620
diff changeset
  3143
                and:[ (k startsWith:'Undeclared:::') not
260b9fd17388 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4620
diff changeset
  3144
                and:[ ((k includes:$:) and:[ (k includesString:'::') not]) not ]]) ifTrue:[
260b9fd17388 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4620
diff changeset
  3145
                    names add:k
260b9fd17388 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4620
diff changeset
  3146
                ]
260b9fd17388 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4620
diff changeset
  3147
            ].
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3148
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3149
            "/ only consider all globals, if the first char of the completed name is uppercase;
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3150
            "/ otherwise, only consider names with a caseInsensitve prefix match
4665
260b9fd17388 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4620
diff changeset
  3151
            nm first isUppercase ifFalse:[
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3152
                names := names select:[:globalName | globalName asLowercase startsWith: nm].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3153
            ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3154
            addWithFactorBlock value:names value:(1.5 * globalFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3155
        ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3156
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3157
        "/ pseudos - assuming that thisContext is seldom used.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3158
        "/ also assuming, that nil is short so its usually typed in.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3159
        addWithFactorBlock value:#('self') value:(2.5 * localFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3160
        addWithFactorBlock value:#('nil') value:(0.5 * localFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3161
        addWithFactorBlock value:#('super' 'false' 'true') value:(2 * localFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3162
        addWithFactorBlock value:#('thisContext') value:(1 * localFactor).
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3163
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3164
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3165
    allDistances isEmpty ifTrue:[^ self].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3166
4410
bee334ff01be class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4409
diff changeset
  3167
"/ nope (foo := foo + 1) should be possible!!
bee334ff01be class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4409
diff changeset
  3168
"/    (parent notNil and:[parent isAssignment]) ifTrue:[
bee334ff01be class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4409
diff changeset
  3169
"/        "/ remove the left side of the assignment (to avoid foo := foo suggestions)
bee334ff01be class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4409
diff changeset
  3170
"/        |i|
bee334ff01be class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4409
diff changeset
  3171
"/
bee334ff01be class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4409
diff changeset
  3172
"/        i := allDistances findFirst:[:entry | entry key = parent variable name].
bee334ff01be class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4409
diff changeset
  3173
"/        i ~~ 0 ifTrue:[
bee334ff01be class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4409
diff changeset
  3174
"/            allDistances removeAtIndex:i
bee334ff01be class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4409
diff changeset
  3175
"/        ].
bee334ff01be class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4409
diff changeset
  3176
"/    ].
4385
d3381caeb327 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4382
diff changeset
  3177
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3178
    bestAssoc := allDistances at:1.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3179
    bestAssoc := allDistances inject:bestAssoc into:[:el :best | el value > best value
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3180
                                                           ifTrue:[el]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3181
                                                           ifFalse:[best]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3182
                                                    ].
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3183
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3184
    allDistances sort:[:a :b |
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3185
                                a value > b value ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3186
                                    true
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3187
                                ] ifFalse:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3188
                                    a value = b value ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3189
                                        a key < b key
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3190
                                    ] ifFalse:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3191
                                        false
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3192
                                    ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3193
                                ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3194
                      ].
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3195
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3196
    allTheBest := allDistances.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3197
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3198
    nameIsOK ifTrue:[
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3199
        "/ if the name already exists, only allow longer names, if there are
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3200
        longerNames := allTheBest select:[:assoc | assoc key startsWith:nm].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3201
        longerNames notEmpty ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3202
            allTheBest := longerNames.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3203
        ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3204
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3205
    allTheBest size > 15 ifTrue:[
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3206
        "/ remove all those which are below some threshold or are a prefix
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3207
        0.4 to:0.9 by:0.1 do:[:delta |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3208
            "/ if still too many, remove more and more
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3209
            allTheBest size > 15 ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3210
                allTheBest := allDistances select:[:entry | (entry key startsWith:nm) or:[ entry value >= (bestAssoc value * delta) ]].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3211
            ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3212
        ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3213
        allTheBest size > 15 ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3214
            "/ remove all those which are below some threshold
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3215
            0.4 to:0.9 by:0.1 do:[:delta |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3216
                "/ if still too many, remove more and more
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3217
                allTheBest size > 15 ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3218
                    allTheBest := allDistances select:[:entry | entry value >= (bestAssoc value * delta) ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3219
                ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3220
            ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3221
        ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3222
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3223
    suggestions := allTheBest collect:[:assoc | assoc key].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3224
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3225
    "/ finally, the trick is to bring them into a reasonable order...
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3226
    "/ sort the prefix matchers by length, the others by spelling distance
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3227
    "/ and bring the prefix-matchers towards the beginning
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3228
    suggestions := ((suggestions select:[:s | s startsWith:nm]) sort:[:a :b | a size < b size ])
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3229
                   ,
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3230
                   (suggestions reject:[:s | s startsWith:nm]).
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3231
4417
a523d812f6c1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4416
diff changeset
  3232
    "/ if super is among them, add a full call to the completions
a523d812f6c1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4416
diff changeset
  3233
    (suggestions includes:'super') ifTrue:[
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3234
        (tree notNil
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3235
        and:[ tree isMethod ]) ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3236
            Error handle:[:ex |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3237
                Transcript showCR:'parse error in code completion ignored'.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3238
            ] do:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3239
                suggestions addFirst:('super ',(Parser methodSpecificationForSelector:tree selector argNames:(tree argumentNames)),'.').
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3240
            ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3241
        ].
4417
a523d812f6c1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4416
diff changeset
  3242
    ].
4620
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3243
    "/ self halt.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3244
    editAction :=
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3245
        [:index |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3246
            |answer start stop oldVar|
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3247
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3248
            answer := suggestions at:index.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3249
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3250
            start := node start.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3251
            stop := node stop.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3252
            oldVar := (codeView textFromCharacterPosition:start to:stop) asString string withoutSeparators.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3253
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3254
            oldLen := stop - start + 1.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3255
            newLen := answer size.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3256
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3257
            codeView
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3258
                undoableDo:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3259
                    codeView replaceFromCharacterPosition:start to:stop with:(answer).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3260
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3261
                    (answer startsWith:oldVar) ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3262
                        codeView selectFromCharacterPosition:start+oldLen to:start+newLen-1.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3263
                    ] ifFalse:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3264
                        codeView selectFromCharacterPosition:start to:start+newLen-1.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3265
                    ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3266
                    codeView dontReplaceSelectionOnInput
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3267
                ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3268
                info:'Completion'.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3269
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3270
        ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3271
4620
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3272
    suggestionsWithInfo := 
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3273
        suggestions 
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3274
            collect:[:eachName |
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3275
                |val|
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3276
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3277
                val := self valueOfVariable:eachName.
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3278
                val isNil ifTrue:[
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3279
                    eachName
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3280
                ] ifFalse:[
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3281
                    eachName,' (',val class name,')'
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3282
                ].
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3283
            ].
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3284
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3285
    actionBlock value:suggestionsWithInfo value:editAction value:nil.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3286
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3287
    "Created: / 10-11-2006 / 13:16:33 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3288
    "Modified: / 16-02-2010 / 10:13:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
4314
3c3df9c97f74 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4311
diff changeset
  3289
    "Modified: / 30-07-2013 / 08:36:11 / cg"
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3290
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3291
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3292
findNodeForInterval:interval in:source
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3293
    |tree node|
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3294
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3295
    interval isEmpty ifTrue: [^ nil].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3296
    RBParser isNil ifTrue: [^ nil].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3297
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3298
    source = LastSource ifTrue:[
4775
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3299
        tree := LastParseTree.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3300
    ] ifFalse:[
4775
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3301
        tree := RBParser
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3302
                parseMethod:source
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3303
                onError:
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3304
                    [:str :err ":nodesSoFar" |
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3305
                        "Transcript showCR:'Parse-Error: ',str."
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3306
                        nil
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3307
                    ].
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3308
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3309
        tree isNil ifTrue:[
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3310
            "/ try to parse as an expression
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3311
            tree := RBParser
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3312
                    parseExpression:source
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3313
                    onError:
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3314
                        [:str :err ":nodesSoFar" |
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3315
                            "Transcript showCR:'Parse-Error: ',str."
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3316
                            nil
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3317
                        ].
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3318
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3319
            tree isNil ifTrue:[
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3320
                ^ nil
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3321
            ].
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3322
        ].
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3323
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3324
        LastSource := source.
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3325
        LastParseTree := tree.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3326
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3327
4775
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3328
    Error handle:[:ex |
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3329
    ] do:[ 
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3330
        node := tree whichNodeIsContainedBy:interval.
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3331
    ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3332
    node isNil ifTrue: [
4775
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3333
        node := tree bestNodeFor: interval.
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3334
        node isNil ifTrue: [
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3335
            node := self findNodeIn:tree forInterval:interval
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3336
        ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3337
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3338
    ^ node
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3339
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3340
    "Modified: / 06-07-2011 / 12:42:53 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3341
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3342
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3343
findNodeForInterval:interval in:source allowErrors:allowErrors
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3344
    ^ self
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3345
	findNodeForInterval:interval in:source allowErrors:allowErrors
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3346
	mustBeMethod:false
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3347
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3348
    "Modified: / 16-09-2011 / 14:52:28 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3349
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3350
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3351
findNodeForInterval:interval in:source allowErrors:allowErrors mustBeMethod:mustBeMethod
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3352
    "if mustBeMethod is true, do not try a regular expression (as in a workspace)."
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3353
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3354
    ^ self
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3355
	findNodeForInterval:interval in:source allowErrors:allowErrors
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3356
	mustBeMethod:mustBeMethod mustBeExpression:false
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3357
!
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3358
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3359
findNodeForInterval:interval in:source allowErrors:allowErrors mustBeMethod:mustBeMethod mustBeExpression:mustBeExpression
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3360
    "parse it as expression or method;
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3361
     if mustBeMethod is true, do not try a regular expressions (as in a workspace);
4367
dd00d1570f88 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4366
diff changeset
  3362
     if mustBeExpression is true, do not try method"
dd00d1570f88 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4366
diff changeset
  3363
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3364
    |intersectingNodes smallestIntersectingNode firstIntersectingNode
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3365
     lastIntersectingNode onErrorBlock
4373
93f9e6259b3a class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4372
diff changeset
  3366
     nodeGenerationHook parserClass parser currentScopeNodes bestNode|
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3367
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3368
    interval isEmpty ifTrue: [^ nil].
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  3369
    languageOrNil notNil ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3370
	parserClass := languageOrNil parserClass.
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  3371
    ] ifFalse:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3372
	classOrNil notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3373
	    parserClass := classOrNil programmingLanguage parserClass.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3374
	]
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  3375
    ].
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3376
    parserClass notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3377
	"/ hack
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3378
	parserClass == Parser ifTrue: [
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3379
	    parserClass := RBParser.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3380
	].
4373
93f9e6259b3a class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4372
diff changeset
  3381
    ] ifFalse:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3382
	parserClass := RBParser.
4373
93f9e6259b3a class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4372
diff changeset
  3383
    ].
93f9e6259b3a class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4372
diff changeset
  3384
    parserClass isNil ifTrue: [^ nil].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3385
4361
88d1ef0ad830 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4358
diff changeset
  3386
    rememberedScopeNodes := nil.
4434
b15ce7d47dd8 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4433
diff changeset
  3387
    rememberedNodes := OrderedCollection new.
4361
88d1ef0ad830 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4358
diff changeset
  3388
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3389
    "/ LastSource := nil.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3390
    source = LastSource ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3391
	tree := LastParseTree.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3392
	tokens := LastScanTokens.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3393
    ] ifFalse:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3394
	intersectingNodes := OrderedCollection new.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3395
	currentScopeNodes := IdentitySet new.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3396
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3397
	onErrorBlock :=
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3398
	    [:str :err :nodesSoFar |
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3399
		|nodes|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3400
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3401
		allowErrors ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3402
		    rememberedScopeNodes := currentScopeNodes.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3403
		    firstIntersectingNode notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3404
			^ firstIntersectingNode
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3405
		    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3406
		    nodesSoFar notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3407
			nodes := nodesSoFar asOrderedCollection
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3408
				    collect:[:nd | nd whichNodeIntersects:interval]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3409
				    thenSelect:[:nd | nd notNil ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3410
			nodes size == 1 ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3411
			    ^ nodes first
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3412
			].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3413
		    ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3414
		].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3415
		nil
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3416
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3417
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3418
	self debuggingCodeFor:#cg is:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3419
	    Transcript show:'looking for: '; showCR:interval.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3420
	].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3421
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3422
	nodeGenerationHook :=
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3423
	    [:node |
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3424
		rememberedNodes add:node.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3425
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3426
		"/ would like to return here as soon as the node has been created by the parser;
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3427
		"/ however, at that time, its parent(chain) is not yet created and so we might not know
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3428
		"/ what the semantic interpretation (especially: scope of variable) will be.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3429
		"/ therefore, we parse all, and return the found node at the end.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3430
		(node isMethod or:[node isBlock or:[node isSequence]]) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3431
		    currentScopeNodes add:node.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3432
		] ifFalse:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3433
		    self debuggingCodeFor:#cg is:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3434
			Transcript show:node; show:' '; show:node start; show:'->'; showCR:node stop.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3435
		    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3436
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3437
		    (node intersectsInterval:interval) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3438
			self debuggingCodeFor:#cg is:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3439
			    Transcript showCR:'yes'.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3440
			].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3441
			intersectingNodes add:node.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3442
			firstIntersectingNode isNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3443
			    firstIntersectingNode := lastIntersectingNode := smallestIntersectingNode := node
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3444
			] ifFalse:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3445
			    |lenNode lenSmallest|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3446
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3447
			    lenNode := (node stop - node start).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3448
			    lenSmallest := (smallestIntersectingNode stop - smallestIntersectingNode start).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3449
			    lenNode < lenSmallest ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3450
				smallestIntersectingNode := node.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3451
			    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3452
			    node start > lastIntersectingNode start ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3453
				lastIntersectingNode := node.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3454
			    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3455
			].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3456
		    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3457
		].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3458
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3459
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3460
	"/ one of the big problems when using the RBParser here is
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3461
	"/ that it behaves badly when a syntax error is encountered;
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3462
	"/ for example, a node's parent is usually set AFTER the children are
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3463
	"/ completely parsed (for example, a blockNode gets the parent-method only
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3464
	"/ after parsing). Thus, when an error is encountered, we cannot walk
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3465
	"/ the parent chain, and therefore will not see the outer locals/args of
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3466
	"/ an inner scope (allVariablesOnScope returns only a partial set).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3467
	"/ A walkaround is to remember Method/Block nodes as created in the above node generation.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3468
	"/ The disadvantage of it is that we do not have correct scope information, until the nodes
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3469
	"/ parent gets set eventually, this we might consider locals from sibling blocks.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3470
	"/ See rememberedScopeNodes handling above.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3471
	"/ Those other nodes are only remembered for failed parses;
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3472
	"/ if the parse is ok, rememberedScopeNodes will be nil.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3473
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3474
	mustBeExpression ifFalse:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3475
	    tree := parserClass
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3476
			parseMethod: source
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3477
			setup:[:p |
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3478
			    parser := p.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3479
			    p rememberNodes:true.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3480
			    p rememberTokens:true.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3481
			    p nodeGenerationCallback:nodeGenerationHook
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3482
			]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3483
			onError: onErrorBlock.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3484
	    parser notNil ifTrue:[ tokens := parser rememberedTokens ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3485
	].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3486
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3487
	mustBeMethod ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3488
	    "/ only cache parsed methods
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3489
	    tree notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3490
		LastSource := source.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3491
		LastParseTree := tree.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3492
		LastScanTokens := tokens.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3493
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3494
	] ifFalse:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3495
	    (tree isNil or:[firstIntersectingNode isNil]) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3496
		"/ try as an expression
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3497
		tree := parserClass
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3498
			    parseExpression: source
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3499
			    setup:[:p |
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3500
				parser := p.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3501
				p rememberNodes:true.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3502
				p rememberTokens:true.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3503
				p nodeGenerationCallback:nodeGenerationHook
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3504
			    ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3505
			    onError: onErrorBlock.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3506
		parser notNil ifTrue:[ tokens := parser rememberedTokens ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3507
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3508
	].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3509
	lastIntersectingNode notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3510
	    self debuggingCodeFor:#cg is:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3511
		Transcript show:'last: '; showCR:lastIntersectingNode.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3512
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3513
	    ^ lastIntersectingNode
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3514
	].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3515
	"/ firstIntersectingNode notNil ifTrue:[ ^ firstIntersectingNode ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3516
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3517
4367
dd00d1570f88 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4366
diff changeset
  3518
    bestNode := self findNodeForInterval:interval inParseTree:tree.
dd00d1570f88 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4366
diff changeset
  3519
    self debuggingCodeFor:#cg is:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3520
	Transcript show:'best: '; showCR:bestNode.
4367
dd00d1570f88 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4366
diff changeset
  3521
    ].
dd00d1570f88 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4366
diff changeset
  3522
    ^ bestNode
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3523
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3524
    "Created: / 16-09-2011 / 14:52:08 / cg"
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  3525
    "Modified: / 18-09-2013 / 16:47:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3526
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3527
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3528
findNodeForInterval:interval inParseTree:parseTree
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3529
    |node|
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3530
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3531
    interval isEmpty ifTrue: [^ nil].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3532
    parseTree isNil ifTrue:[^ nil].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3533
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3534
    node := parseTree whichNodeIsContainedBy:interval.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3535
    node isNil ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3536
	node := parseTree whichNodeIntersects:interval.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3537
	node isNil ifTrue: [
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3538
	    node := self findNodeIn:parseTree forInterval:interval
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3539
	].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3540
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3541
    ^ node
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3542
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3543
    "Modified: / 10-11-2006 / 13:13:58 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3544
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3545
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3546
findNodeIn:tree forInterval:interval
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3547
    |nodeFound wouldReturn|
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3548
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3549
    nodeFound := nil.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3550
    tree nodesDo:[:eachNode |
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3551
	(eachNode intersectsInterval:interval) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3552
	    (nodeFound isNil or:[nodeFound == eachNode parent]) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3553
		nodeFound := eachNode
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3554
	    ] ifFalse:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3555
		(nodeFound parent == eachNode parent
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3556
		and:[ eachNode start >= nodeFound start
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3557
		      and:[ eachNode stop <= nodeFound stop ] ]) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3558
		] ifFalse:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3559
		    (nodeFound parent notNil
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3560
		    and:[nodeFound parent isCascade and:[eachNode parent isCascade]]) ifFalse:[^ nil]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3561
		]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3562
	    ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3563
	] ifFalse:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3564
	    nodeFound notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3565
		"/ already found one - beyond that one; leave
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3566
		wouldReturn notNil ifTrue:[wouldReturn := nodeFound].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3567
	    ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3568
	].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3569
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3570
"/ (wouldReturn notNil and:[wouldReturn ~~ node]) ifTrue:[self halt].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3571
    ^ nodeFound
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3572
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3573
    "Modified: / 20-11-2006 / 12:31:12 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3574
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3575
4421
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  3576
insertAdditonalStuffAfterSelector:chosenCompletion
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  3577
    |optionalExtraSpace|
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  3578
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3579
    optionalExtraSpace := (codeView characterAfterCursor isSeparator)
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3580
			    ifTrue:['']
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3581
			    ifFalse:[' '].
4421
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  3582
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  3583
    (
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3584
	#(
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3585
	    'ifTrue:' 'ifFalse:' 'ifTrue:ifFalse:' 'ifFalse:ifTrue:'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3586
	    'and:' 'or:' 'timesRepeat:' 'whileTrue:' 'whileFalse:'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3587
	) includes:chosenCompletion
4421
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  3588
    ) ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3589
	codeView insertStringAtCursor:('[',optionalExtraSpace).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3590
	"/ codeView cursorLeft:1+extra size.
4421
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  3591
    ].
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  3592
    (
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3593
	#(
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3594
	    'collect:' 'select:' 'reject:' 'do:'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3595
	) includes:chosenCompletion
4421
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  3596
    ) ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3597
	codeView insertStringAtCursor:('[:each | ]',optionalExtraSpace).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3598
	codeView cursorLeft:1+optionalExtraSpace size.
4421
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  3599
    ].
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  3600
    (
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3601
	#(
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3602
	    'contains:' 'findFirst:' 'detect:'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3603
	) includes:chosenCompletion
4421
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  3604
    ) ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3605
	codeView insertStringAtCursor:('[:some | ]',optionalExtraSpace).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3606
	codeView cursorLeft:1+optionalExtraSpace size.
4421
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  3607
    ].
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  3608
    (
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3609
	#(
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3610
	    'remove:ifAbsent:' 'detect:ifNone:'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3611
	) includes:chosenCompletion
4421
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  3612
    ) ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3613
	codeView insertStringAtCursor:('[]',optionalExtraSpace).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3614
	codeView cursorLeft:1+optionalExtraSpace size.
4421
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  3615
    ].
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  3616
!
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  3617
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3618
old_askUserForCompletion:what for:codeView from:allTheBest
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3619
    |list resources choice lastChoice|
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3620
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3621
    allTheBest isEmpty ifTrue:[ ^ nil ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3622
    allTheBest size == 1 ifTrue:[ ^ allTheBest first ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3623
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3624
    list := allTheBest.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3625
    LastChoices notNil ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3626
	lastChoice := LastChoices at:what ifAbsent:nil.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3627
	lastChoice notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3628
	    "/ move tha last choice to the top of the list, if it is in.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3629
	    (list includes: lastChoice) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3630
		(list indexOf: lastChoice) < 10 ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3631
		    list := {lastChoice allBold } , (list copyWithout:lastChoice).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3632
		]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3633
	    ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3634
	].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3635
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3636
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3637
    list size < 30 ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3638
	|menu idx exitKey|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3639
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3640
	menu := PopUpMenu labels:list.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3641
	menu hideOnKeyFilter:[:key | |hide|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3642
		hide := ( #( CursorDown CursorUp Escape Return ) includes: key) not.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3643
		hide ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3644
		    exitKey := key.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3645
		].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3646
		hide].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3647
	menu memorizeLastSelection:3 "sigh, not 1 because of heading!!".
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3648
	idx := menu startUpWithHeading:'Choose ',what.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3649
	idx == 0 ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3650
	    exitKey notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3651
		codeView keyPress:exitKey x:0 y:0.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3652
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3653
	    ^ nil
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3654
	].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3655
	choice := list at:idx.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3656
    ] ifFalse:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3657
	resources := codeView application isNil
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3658
			ifTrue:[ codeView resources]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3659
			ifFalse:[ codeView application resources ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3660
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3661
	choice := Dialog
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3662
	   choose:(resources string:'Choose ',what)
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3663
	   fromList:list
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3664
	   lines:20
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3665
	   initialSelection:(list firstIfEmpty:nil)
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3666
	   title:(resources string:'Code completion').
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3667
	choice isNil ifTrue:[^ nil].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3668
    ].
4301
90f7571df306 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4284
diff changeset
  3669
    choice := choice string.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3670
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3671
    LastChoices isNil ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3672
	LastChoices := Dictionary new.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3673
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3674
    LastChoices at:what put:choice.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3675
    ^ choice
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3676
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3677
    "Created: / 16-02-2010 / 09:38:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  3678
    "Modified: / 28-08-2013 / 15:28:01 / cg"
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3679
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3680
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3681
treeForCode:source allowErrors:allowErrors
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3682
    |tree|
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3683
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3684
    source = LastSource ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3685
	tree := LastParseTree.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3686
    ] ifFalse:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3687
	tree := RBParser
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3688
		parseMethod:source
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3689
		onError: [:str :err :nodesSoFar :parserOrNil|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3690
			allowErrors ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3691
			    "/ parserOrNil isNil if raised by the scanner
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3692
			    parserOrNil notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3693
				^ parserOrNil currentMethodNode
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3694
			    ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3695
			].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3696
			^ nil
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3697
		    ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3698
		proceedAfterError:false
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3699
		rememberNodes:true.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3700
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3701
	tree notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3702
	    LastSource := source.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3703
	    LastParseTree := tree.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3704
	]
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3705
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3706
    ^ tree
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3707
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3708
    "Modified: / 13-01-2012 / 11:54:30 / cg"
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3709
!
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3710
4524
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  3711
tryCodeCompletionWithSource:source nodeInterval:interval at:characterPositionOfCursor mustBeExpression:mustBeExpression into:actionBlock
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3712
    "this is tried multiple times;
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3713
	first with cursor line only
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3714
	then with the source copied up to the cursor position,
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3715
	then with the full source.
4381
43de05e6af6c class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4379
diff changeset
  3716
     Either one may give better results (for example, when completing
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3717
     after a keyword selector, and the remaining code would lead to a syntactically
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3718
     legal, but stupid message send to be parsed...
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3719
     (which happens often after inserting)"
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3720
4544
a07061d382ce class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4543
diff changeset
  3721
    |node nodeParent checkedNode characterBeforeCursor nodeIsInTemporaries|
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3722
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3723
    "/ this is too naive and stupid; if there is a syntactic error,
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3724
    "/ we will not find a node for a long time (stepping back more and more,
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3725
    "/ until reaching the beginning). This leads to a thousand and more times reparsing
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3726
    "/ without any progress.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3727
    "/ TODO: do it vice-versa, in that the parser does a callOut for every node generated
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3728
    "/ as it parses the code. Stop, when the interval is hit.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3729
    "/ that will also work for syntactic incorrect source code.
4524
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  3730
    (mustBeExpression not and:[methodOrNil notNil or:[classOrNil notNil]]) ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3731
	node := self findNodeForInterval:interval in:source allowErrors:true mustBeMethod:true.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3732
    ].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3733
    node isNil ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3734
	node := self findNodeForInterval:interval in:source allowErrors:true mustBeMethod:false mustBeExpression:true.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3735
	node isNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3736
	    "/ Transcript showCR:'No parseNode found (syntax error before or in comment?)'.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3737
	    self information:'No parseNode found (syntax error before or in comment?)'.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3738
	    ^ self.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3739
	].
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3740
    ].
4544
a07061d382ce class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4543
diff changeset
  3741
    nodeParent := node parent.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3742
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3743
    (node isVariable
4544
a07061d382ce class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4543
diff changeset
  3744
    and:[ nodeParent notNil
a07061d382ce class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4543
diff changeset
  3745
    and:[ nodeParent isMessage
4368
442517f0d19d class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4367
diff changeset
  3746
    and:[ node stop < (characterPositionOfCursor-1) ]]]) ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3747
	node := nodeParent.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3748
	nodeParent := node parent.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3749
    ].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3750
4525
71ebd312132a class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4524
diff changeset
  3751
    characterBeforeCursor := source at:(characterPositionOfCursor-1 max:1). "/ codeView characterBeforeCursor.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3752
    characterBeforeCursor isNil ifTrue:[ "at begin of line" ^ self].
4358
d9978bce6853 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4356
diff changeset
  3753
    characterBeforeCursor == $. ifTrue:[ "at end of statement" ^ self].
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3754
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3755
    node isVariable ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3756
	nodeIsInTemporaries :=
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3757
	    nodeParent notNil
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3758
	    and:[ nodeParent isSequence
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3759
	    and:[ nodeParent temporaries notEmptyOrNil
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3760
	    and:[ node stop <= nodeParent temporaries last stop ]]].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3761
	nodeIsInTemporaries ifFalse:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3762
	    "/ cursor must be right after the variable
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3763
	    characterPositionOfCursor >= (node stop) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3764
		self codeCompletionForVariable:node into:actionBlock.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3765
	    ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3766
	].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3767
	^ self.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3768
    ].
4367
dd00d1570f88 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4366
diff changeset
  3769
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3770
    node isLiteral ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3771
	"/ however, user may want to complete a symbol inside a literal array!!
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3772
	node value isArray ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3773
	    node token isLiteralArray ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3774
		|elementBeforeCursor searcher|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3775
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3776
		elementBeforeCursor := node token value detect:[:anElementToken | characterPositionOfCursor == (anElementToken stop + 1)] ifNone:nil.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3777
		elementBeforeCursor isNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3778
		    searcher :=
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3779
			[:tok :check |
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3780
			    tok isLiteralArray ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3781
				tok value inject:nil into:[:found :el | found ifNil:[searcher value:el value:check]]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3782
			    ] ifFalse:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3783
				(check value:tok) ifTrue:[tok] ifFalse:[nil]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3784
			    ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3785
			].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3786
		    elementBeforeCursor := searcher value:node token value:[:anElementToken | characterPositionOfCursor == (anElementToken stop)].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3787
		].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3788
		(elementBeforeCursor notNil and:[ elementBeforeCursor value isSymbol ]) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3789
		    self codeCompletionForLiteralSymbol:nil element:elementBeforeCursor considerAll:true into:actionBlock.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3790
		    ^ self.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3791
		].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3792
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3793
	].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3794
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3795
	"/ cursor must be right after the literal
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3796
	characterPositionOfCursor == (node stop + 1) ifFalse:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3797
	    ^ self
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3798
	].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3799
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3800
	node value isSymbol ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3801
	    self codeCompletionForLiteralSymbol:node element:nil considerAll:false into:actionBlock.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3802
	    ^ self.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3803
	].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3804
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3805
	"/ huh - completing strings, numbers or what?
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3806
	(nodeParent notNil
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3807
	    and:[ nodeParent isMessage
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3808
	    and:[ nodeParent isKeyword ]])
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3809
	ifFalse:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3810
	    ^ self
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3811
	].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3812
	"/ no, move up and try completing the outer keyword message (next arg)
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3813
	node := nodeParent.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3814
	nodeParent := node parent.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3815
    ].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3816
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3817
    checkedNode := node.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3818
    [checkedNode notNil] whileTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3819
	(characterPositionOfCursor < (checkedNode stop ? source size)) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3820
	    self information:'Inside a message node'.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3821
	    ^ self.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3822
	].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3823
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3824
	checkedNode isMessage ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3825
	    "/ completion in a message-send
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3826
	    self codeCompletionForMessage:checkedNode into:actionBlock.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3827
	    ^ self
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3828
	].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3829
	checkedNode isMethod ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3830
	    "/ completion in a method's selector pattern
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3831
	    self codeCompletionForMethodSpec:checkedNode into:actionBlock.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3832
	    ^ self.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3833
	].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3834
	checkedNode := checkedNode parent.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3835
    ].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3836
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3837
    self information:'Node is neither variable nor message.'.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3838
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3839
    "Modified: / 04-07-2006 / 18:48:26 / fm"
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3840
    "Modified: / 16-09-2011 / 14:54:47 / cg"
4375
305981eb7976 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4374
diff changeset
  3841
!
305981eb7976 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4374
diff changeset
  3842
4422
ee7c441fce69 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4421
diff changeset
  3843
valueOfNode:aNode
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3844
    "when showing possible completions for a message,
4422
ee7c441fce69 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4421
diff changeset
  3845
     it is a good idea to know what the reveiver's value is.
ee7c441fce69 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4421
diff changeset
  3846
     Sigh - returns nil both if unknown AND if a real nil is there."
ee7c441fce69 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4421
diff changeset
  3847
4620
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3848
    |nodeSelector nodeReceiver isNonDestructive receiverValue method|
4422
ee7c441fce69 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4421
diff changeset
  3849
ee7c441fce69 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4421
diff changeset
  3850
    aNode isLiteral ifTrue:[
4620
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3851
        ^ aNode value
4422
ee7c441fce69 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4421
diff changeset
  3852
    ].
ee7c441fce69 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4421
diff changeset
  3853
    aNode isVariable ifTrue:[
4620
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3854
        ^ self valueOfVariable:aNode name.
4422
ee7c441fce69 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4421
diff changeset
  3855
    ].
ee7c441fce69 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4421
diff changeset
  3856
ee7c441fce69 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4421
diff changeset
  3857
    aNode isMessage ifTrue:[
4620
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3858
        nodeSelector := aNode selector.
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3859
        nodeReceiver := aNode receiver.
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3860
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3861
        "/ some hardwired knowlegde here
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3862
        classOrNil notNil ifTrue:[
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3863
            (nodeReceiver isSelf and:[nodeSelector = #'class']) ifTrue:[
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3864
                ^ classOrNil
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3865
            ].
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3866
        ].
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3867
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3868
        isNonDestructive := false.
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3869
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3870
        ( #( class theMetaclass theNonMetaclass ) includes:nodeSelector) ifTrue:[
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3871
            isNonDestructive := true.
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3872
        ] ifFalse:[
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3873
            "/ follow non-destructive accessors
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3874
            receiverValue := self valueOfNode:nodeReceiver.
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3875
            receiverValue notNil ifTrue:[
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3876
                method := receiverValue class lookupMethodFor:nodeSelector.
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3877
                method notNil ifTrue:[
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3878
                    (ParseTreeSearcher methodIsJustReturningSomething:method) ifTrue:[
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3879
                        "/ we can savely call that method to get the current value
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3880
                        ^ receiverValue perform: nodeSelector.
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3881
                    ]
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3882
                ].
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3883
            ].
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3884
        ].
4422
ee7c441fce69 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4421
diff changeset
  3885
    ].
ee7c441fce69 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4421
diff changeset
  3886
ee7c441fce69 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4421
diff changeset
  3887
    ^ nil
ee7c441fce69 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4421
diff changeset
  3888
ee7c441fce69 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4421
diff changeset
  3889
    "Created: / 28-08-2013 / 16:34:53 / cg"
ee7c441fce69 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4421
diff changeset
  3890
!
ee7c441fce69 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4421
diff changeset
  3891
4620
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3892
valueOfVariable:aVariableName
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3893
    "when showing possible completions for a variable,
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3894
     it is a good idea to know what the reveiver's value is.
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3895
     Sigh - returns nil both if unknown AND if a real nil is there."
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3896
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3897
    |nodeVal con privateClass|
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3898
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3899
    aVariableName isUppercaseFirst ifTrue:[
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3900
        "/ simply 'evaluate' the variable (like in a browser's codeView)
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3901
        "/ mhmh - will we catch workspace vars then?
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3902
        Error handle:[:ex |
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3903
        ] do:[
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3904
            nodeVal := Parser new evaluate:aVariableName in:nil receiver:classOrNil.
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3905
        ].
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3906
        nodeVal notNil ifTrue:[
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3907
            ^ nodeVal
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3908
        ].
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3909
        classOrNil notNil ifTrue:[
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3910
            (classOrNil theNonMetaclass classVarNames includes:aVariableName) ifTrue:[
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3911
                nodeVal := classOrNil theNonMetaclass classVarAt:aVariableName.
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3912
                ^ nodeVal.
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3913
            ].
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3914
            privateClass := classOrNil theNonMetaclass privateClasses detect:[:cls | cls nameWithoutPrefix = aVariableName] ifNone:nil.
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3915
            privateClass notNil ifTrue:[
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3916
                nodeVal := privateClass.
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3917
                ^ nodeVal.
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3918
            ].
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3919
        ].
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3920
        ^ nil
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3921
    ].
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3922
    aVariableName = 'self' ifTrue:[
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3923
        (classOrNil notNil and:[classOrNil isMeta]) ifTrue:[^ classOrNil theNonMetaclass].
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3924
        contextOrNil notNil ifTrue:[^ contextOrNil receiver].
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3925
        ^ nil
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3926
    ].
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3927
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3928
    contextOrNil notNil ifTrue:[
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3929
        con := contextOrNil.
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3930
        [ con notNil ] whileTrue:[
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3931
            "/ a local in the context?
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3932
            ((con argAndVarNames ? #()) includes:aVariableName) ifTrue:[
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3933
                nodeVal := con argsAndVars at:(con argAndVarNames indexOf:aVariableName) ifAbsent:nil.
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3934
                nodeVal notNil ifTrue:[
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3935
                    ^ nodeVal
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3936
                ].
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3937
            ].
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3938
            con := con home.
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3939
        ].
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3940
        "/ an instvar
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3941
        (contextOrNil receiver class allInstVarNames includes:aVariableName) ifTrue:[
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3942
            nodeVal := contextOrNil receiver instVarNamed:aVariableName.
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3943
            nodeVal notNil ifTrue:[
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3944
                ^ nodeVal
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3945
            ].
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3946
        ].
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3947
    ].
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3948
    ^ nil
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3949
!
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3950
4375
305981eb7976 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4374
diff changeset
  3951
withoutSelectorsUnlikelyFor:aClass from:selectorsArg forPartial:partialSelector
4592
ba8cb2c6ef61 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4591
diff changeset
  3952
    "some heuristics;
ba8cb2c6ef61 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4591
diff changeset
  3953
     as best selectors has been chosen by implemented methods for aClass,
ba8cb2c6ef61 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4591
diff changeset
  3954
     some of them should be filtered (for example, at:/at:put:, which are
ba8cb2c6ef61 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4591
diff changeset
  3955
     found in object, but only make sense for variable objects or those which do
ba8cb2c6ef61 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4591
diff changeset
  3956
     implement at:put: themself.
ba8cb2c6ef61 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4591
diff changeset
  3957
     I have currently no better idea than hardcoding stuff I found irritating..."
ba8cb2c6ef61 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4591
diff changeset
  3958
4615
6611c207243f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4610
diff changeset
  3959
    |selectors noNilChecks noIsXXXChecks noNoXXXChecks noBecome 
6611c207243f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4610
diff changeset
  3960
     noIndexedSetters noIndexedGetters noSizeQueries|
4408
18567ee46c6a class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4407
diff changeset
  3961
18567ee46c6a class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4407
diff changeset
  3962
    aClass isNil ifTrue:[ ^ selectorsArg ].
18567ee46c6a class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4407
diff changeset
  3963
4615
6611c207243f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4610
diff changeset
  3964
    noNilChecks := noIsXXXChecks := noNoXXXChecks := noBecome := false.
6611c207243f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4610
diff changeset
  3965
    noIndexedSetters := noIndexedGetters := noSizeQueries := false.
4375
305981eb7976 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4374
diff changeset
  3966
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3967
    selectors := (selectorsArg ? #()) asOrderedCollection.
4375
305981eb7976 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4374
diff changeset
  3968
305981eb7976 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4374
diff changeset
  3969
    self tracePoint:#cg message:aClass.
305981eb7976 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4374
diff changeset
  3970
4592
ba8cb2c6ef61 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4591
diff changeset
  3971
    "/ actually meaning booleans here
ba8cb2c6ef61 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4591
diff changeset
  3972
    (aClass == True or:[aClass == False]) ifTrue:[
4615
6611c207243f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4610
diff changeset
  3973
        noNilChecks := noBecome := true.
4592
ba8cb2c6ef61 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4591
diff changeset
  3974
        (partialSelector startsWith:'is') ifFalse:[ noIsXXXChecks := true ].
ba8cb2c6ef61 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4591
diff changeset
  3975
        (partialSelector startsWith:'no') ifFalse:[ noNoXXXChecks := true ].
4375
305981eb7976 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4374
diff changeset
  3976
    ].
305981eb7976 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4374
diff changeset
  3977
4418
149eefdc6206 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4417
diff changeset
  3978
    (aClass includesBehavior: ArithmeticValue) ifTrue:[ noNilChecks := true ].
4615
6611c207243f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4610
diff changeset
  3979
    (aClass includesBehavior: Symbol) ifTrue:[ noNilChecks := noBecome := noIndexedSetters := true ].
6611c207243f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4610
diff changeset
  3980
    (aClass includesBehavior: Number) ifTrue:[ noBecome := true ].
6611c207243f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4610
diff changeset
  3981
    (aClass includesBehavior: Block) ifTrue:[ noNilChecks := noIsXXXChecks := noNoXXXChecks := noBecome := true ].
4418
149eefdc6206 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4417
diff changeset
  3982
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3983
    (aClass isMeta) ifTrue:[
4615
6611c207243f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4610
diff changeset
  3984
        noNilChecks := noBecome := true.
4592
ba8cb2c6ef61 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4591
diff changeset
  3985
        "/ remove messages which are only defined in Object and non-meta classes.
ba8cb2c6ef61 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4591
diff changeset
  3986
        selectors := selectors reject:
ba8cb2c6ef61 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4591
diff changeset
  3987
            [:sel |
ba8cb2c6ef61 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4591
diff changeset
  3988
                (Object implements:sel)
ba8cb2c6ef61 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4591
diff changeset
  3989
                and:[ (Smalltalk allImplementorsOf:sel) conform:[:impl | impl isMeta not]]
ba8cb2c6ef61 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4591
diff changeset
  3990
            ].
ba8cb2c6ef61 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4591
diff changeset
  3991
    ].
ba8cb2c6ef61 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4591
diff changeset
  3992
ba8cb2c6ef61 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4591
diff changeset
  3993
    aClass isVariable ifFalse:[
4615
6611c207243f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4610
diff changeset
  3994
        noIndexedGetters := noIndexedSetters := noSizeQueries := true.
6611c207243f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4610
diff changeset
  3995
    ].
6611c207243f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4610
diff changeset
  3996
6611c207243f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4610
diff changeset
  3997
    noIndexedSetters ifTrue:[
6611c207243f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4610
diff changeset
  3998
        #( #'at:put:' #'basicAt:put:') do:[:indexAccessSelector |
6611c207243f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4610
diff changeset
  3999
            (aClass whichClassIncludesSelector:indexAccessSelector) == Object ifTrue:[
6611c207243f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4610
diff changeset
  4000
                selectors := selectors copyWithout:indexAccessSelector.
6611c207243f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4610
diff changeset
  4001
            ].
6611c207243f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4610
diff changeset
  4002
        ].
6611c207243f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4610
diff changeset
  4003
    ].
6611c207243f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4610
diff changeset
  4004
    noIndexedGetters ifTrue:[
6611c207243f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4610
diff changeset
  4005
        #( #'at:' #'basicAt:') do:[:indexAccessSelector |
6611c207243f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4610
diff changeset
  4006
            (aClass whichClassIncludesSelector:indexAccessSelector) == Object ifTrue:[
6611c207243f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4610
diff changeset
  4007
                selectors := selectors copyWithout:indexAccessSelector.
6611c207243f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4610
diff changeset
  4008
            ].
6611c207243f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4610
diff changeset
  4009
        ].
6611c207243f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4610
diff changeset
  4010
    ].
6611c207243f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4610
diff changeset
  4011
    noSizeQueries ifTrue:[
6611c207243f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4610
diff changeset
  4012
        #( #size #basicSize ) do:[:indexAccessSelector |
4592
ba8cb2c6ef61 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4591
diff changeset
  4013
            (aClass whichClassIncludesSelector:indexAccessSelector) == Object ifTrue:[
ba8cb2c6ef61 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4591
diff changeset
  4014
                selectors := selectors copyWithout:indexAccessSelector.
ba8cb2c6ef61 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4591
diff changeset
  4015
            ].
ba8cb2c6ef61 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4591
diff changeset
  4016
        ].
4408
18567ee46c6a class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4407
diff changeset
  4017
    ].
18567ee46c6a class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4407
diff changeset
  4018
18567ee46c6a class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4407
diff changeset
  4019
    noNilChecks ifTrue:[
4592
ba8cb2c6ef61 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4591
diff changeset
  4020
        selectors removeAllFoundIn:#(
ba8cb2c6ef61 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4591
diff changeset
  4021
                    'isNil' 'notNil'
ba8cb2c6ef61 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4591
diff changeset
  4022
                    'ifNil:' 'ifNotNil:' 'ifNil:ifNotNil:' 'ifNotNil:ifNil:' 'ifNotNilDo:'
ba8cb2c6ef61 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4591
diff changeset
  4023
                    'ifEmpty:' 'ifNotEmpty:' 'ifNotEmptyDo:' 'ifEmpty:ifNotEmpty:'
ba8cb2c6ef61 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4591
diff changeset
  4024
                    'ifEmpty:ifNotEmptyDo:' 'ifNotEmptyDo:ifEmpty:' 'ifEmptyDo:ifNotEmpty:'
ba8cb2c6ef61 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4591
diff changeset
  4025
                  ).
4375
305981eb7976 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4374
diff changeset
  4026
    ].
4408
18567ee46c6a class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4407
diff changeset
  4027
    noIsXXXChecks ifTrue:[
4592
ba8cb2c6ef61 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4591
diff changeset
  4028
        "/ get rid of all isXXX selectors
ba8cb2c6ef61 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4591
diff changeset
  4029
        selectors := selectors reject:[:sel | sel startsWith:'is'].
4375
305981eb7976 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4374
diff changeset
  4030
    ].
4418
149eefdc6206 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4417
diff changeset
  4031
    noNoXXXChecks ifTrue:[
4592
ba8cb2c6ef61 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4591
diff changeset
  4032
        "/ get rid of all notXXX selectors
ba8cb2c6ef61 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4591
diff changeset
  4033
        selectors := selectors reject:[:sel | sel startsWith:'no'].
4418
149eefdc6206 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4417
diff changeset
  4034
    ].
4615
6611c207243f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4610
diff changeset
  4035
    noBecome ifTrue:[
6611c207243f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4610
diff changeset
  4036
        "/ get rid of all become* selectors
6611c207243f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4610
diff changeset
  4037
        selectors := selectors reject:[:sel | sel startsWith:'become'].
6611c207243f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4610
diff changeset
  4038
        selectors remove:#oneWayBecome: ifAbsent:[].
6611c207243f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4610
diff changeset
  4039
        selectors := selectors reject:[:sel | sel startsWith:'changeClassTo'].
6611c207243f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4610
diff changeset
  4040
    ].
4408
18567ee46c6a class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4407
diff changeset
  4041
18567ee46c6a class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4407
diff changeset
  4042
    "/ actually: directly implemented selectors are more likely, so move them to top
18567ee46c6a class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4407
diff changeset
  4043
    selectors := (selectors select:[:sel | aClass implements:sel])
4592
ba8cb2c6ef61 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4591
diff changeset
  4044
                 ,
ba8cb2c6ef61 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4591
diff changeset
  4045
                 (selectors reject:[:sel | aClass implements:sel]).
4408
18567ee46c6a class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4407
diff changeset
  4046
4375
305981eb7976 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4374
diff changeset
  4047
    ^ selectors
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4048
! !
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4049
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4050
!DoWhatIMeanSupport methodsFor:'code completion-helpers-old'!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4051
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4052
codeCompletionForLiteralSymbol:node inClass:classOrNil codeView:codeView
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4053
    |sym possibleCompletions best start stop oldLen newLen oldVar|
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4054
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4055
    sym := node value.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4056
    possibleCompletions := OrderedCollection new.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4057
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4058
    Symbol allInstancesDo:[:existingSym |
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4059
	(existingSym startsWith:sym) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4060
	    (existingSym = sym) ifFalse:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4061
		possibleCompletions add:existingSym
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4062
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4063
	].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4064
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4065
    possibleCompletions sort.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4066
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4067
    best := possibleCompletions longestCommonPrefix.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4068
    (best = sym or:[(possibleCompletions includes:best) not]) ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4069
	best := self askUserForCompletion:'symbol literal' for:codeView at: node start from:possibleCompletions.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4070
	best isNil ifTrue:[^ self].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4071
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4072
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4073
"/ self showInfo:best.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4074
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4075
    start := node start.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4076
    stop := node stop.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4077
    (codeView characterAtCharacterPosition:start) == $# ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4078
	start := start + 1.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4079
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4080
    (codeView characterAtCharacterPosition:start) == $' ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4081
	start := start + 1.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4082
	stop := stop - 1.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4083
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4084
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4085
    oldVar := (codeView textFromCharacterPosition:start to:stop) asString string withoutSeparators.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4086
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4087
    codeView
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4088
	undoableDo:[ codeView replaceFromCharacterPosition:start to:stop with:best ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4089
	info:'Completion'.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4090
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4091
    (best startsWith:oldVar) ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4092
	oldLen := stop - start + 1.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4093
	newLen := best size.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4094
	codeView selectFromCharacterPosition:start+oldLen to:start+newLen-1.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4095
	codeView dontReplaceSelectionOnInput
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4096
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4097
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4098
    "Modified: / 16-02-2010 / 10:15:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4099
    "Modified (format): / 03-07-2011 / 15:58:45 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4100
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4101
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4102
codeCompletionForMessage:node inClass:classOrNil instance:instanceOrNil context:contextOrNil codeView:codeView
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4103
    |selector
4547
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  4104
     bestSelectors selector2 bestSelectors2 bestSelectorsFromRB allBest best numArgs
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4105
     newParts nSelParts oldLen newLen selectorParts
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4106
     findBest parentNode selectorInBest selector2InBest2
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4107
     parser selectorsSentInCode selectorsImplementedInClass split
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  4108
     varName rbTypes rbType tryParent parentIsKeywordMessage parentIsBinaryMessage rcvrClass|
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4109
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4110
    RefactoryTyper notNil ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4111
        "/ refactory package also provides a (very limited) typer;
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4112
        "/ ask it for its oppinion as well (temporary - will vanish, once we have a better typer)
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4113
        (node receiver isVariable) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4114
            varName := node receiver name.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4115
            varName isUppercaseFirst ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4116
            ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4117
                tree := RBParser
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4118
                            parseMethod:codeView contents string
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4119
                            onError:[:aString :pos | nil].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4120
                tree notNil ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4121
                    rbTypes := RefactoryTyper
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4122
                                classesFor: varName
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4123
                                in: tree
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4124
                                model: nil
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4125
                                ignoredSelectors:(Array with:node selector).
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4126
                    rbTypes size > 0 ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4127
                        rbTypes size > 1 ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4128
                            rbTypes remove:ProtoObject ifAbsent:[].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4129
                            rbTypes remove:Autoload ifAbsent:[].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4130
                            rbTypes remove:ObsoleteObject ifAbsent:[].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4131
                        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4132
                        rbTypes size == 1 ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4133
                            rbType := rbTypes first.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4134
                        ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4135
                            rbType := Class commonSuperclassOf:rbTypes
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4136
                        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4137
                        (rbType notNil "and:[rbType ~= Object]") ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4138
                            bestSelectorsFromRB := Parser findBest:30 selectorsFor:node selector in:rbType forCompletion:true.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4139
                        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4140
                    ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4141
                ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4142
            ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4143
        ].
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4144
    ].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4145
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4146
    classOrNil notNil ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4147
        parser := Parser parseMethod:codeView contents string in:classOrNil ignoreErrors:true ignoreWarnings:true.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4148
        selectorsSentInCode := parser messagesSent.
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4149
    ].
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4150
    classOrNil notNil ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4151
        selectorsImplementedInClass := classOrNil selectors.
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4152
    ].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4153
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4154
    findBest := [:node :selector |
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4155
        |srchClass bestSelectors bestPrefixes|
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4156
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4157
        codeView topView withCursor:(Cursor questionMark) do:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4158
            srchClass := self classOfNode:node receiver.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4159
            srchClass notNil ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4160
                bestSelectors := Parser findBest:30 selectorsFor:selector in:srchClass forCompletion:true.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4161
            ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4162
                bestSelectors := Parser findBest:30 selectorsFor:selector in:nil forCompletion:true.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4163
            ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4164
        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4165
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4166
        (bestSelectors includes:selector) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4167
            bestSelectors := bestSelectors select:[:sel | sel size > selector size].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4168
        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4169
        bestSelectors
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4170
    ].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4171
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4172
    selector := node selector.
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4173
    bestSelectors := findBest value:node value:selector.
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4174
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4175
    parentNode := node parent.
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4176
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4177
    parentIsKeywordMessage :=
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4178
        (parentNode notNil
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4179
            and:[ parentNode isMessage
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4180
            and:[ parentNode selector isKeywordSelector]]).
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  4181
    parentIsBinaryMessage :=
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4182
        (parentNode notNil
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4183
            and:[ parentNode isMessage
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4184
            and:[ parentNode selector isBinarySelector]]).
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4185
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4186
    tryParent := false.
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4187
    "/ if its a unary message AND the parent is a keyword node, look for parent completion too.
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4188
    (node selector isUnarySelector and:[ parentIsKeywordMessage ]) ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4189
        tryParent := true.
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4190
    ] ifFalse:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4191
        "/ if the parent is an instance creation message, take that as lookup class.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4192
        (node isMessage
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4193
        and:[ node receiver isMessage
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4194
        and:[ node receiver receiver isVariable
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4195
        and:[ node receiver receiver name isUppercaseFirst
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4196
        and:[ #(new new:) includes:(selector2 := node receiver selector) ]]]]) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4197
            rcvrClass := Smalltalk classNamed:(node receiver receiver name).
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4198
            "/ srchClass2 := self lookupClassForMessage:parentNode inClass:classOrNil.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4199
            bestSelectors := Parser findBest:30 selectorsFor:selector in:rcvrClass forCompletion:true.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4200
        ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4201
            "/ also, if nothing was found
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4202
            (bestSelectors isEmpty
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4203
            and:[ parentNode notNil
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4204
            and:[ parentNode isMessage ]]) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4205
                "/ srchClass2 := self lookupClassForMessage:parentNode inClass:classOrNil.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4206
                "/ selector2 := parentNode selector.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4207
                "/ selector2 := selector2,selector.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4208
                bestSelectors := findBest value:parentNode value:selector.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4209
            ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4210
        ]
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4211
    ].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4212
    tryParent ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4213
        selector2 := parentNode selector,selector.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4214
        bestSelectors2 := findBest value:parentNode value:selector2.
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4215
    ].
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  4216
    bestSelectorsFromRB notEmptyOrNil ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4217
        bestSelectors := bestSelectorsFromRB , (bestSelectors reject:[:sel | bestSelectorsFromRB includes:sel]).
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  4218
    ].
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4219
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4220
    "/ if the parent is a keyword selector, the child cannot
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  4221
    (parentIsKeywordMessage or:[parentIsBinaryMessage]) ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4222
        bestSelectors := bestSelectors reject:[:sel | sel isKeywordSelector]
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4223
    ].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4224
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4225
    bestSelectors2 isEmptyOrNil ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4226
        allBest := bestSelectors.
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4227
    ] ifFalse:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4228
        bestSelectors isEmptyOrNil ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4229
            allBest := bestSelectors2
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4230
        ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4231
            selectorInBest := (bestSelectors contains:[:sel | sel asLowercase startsWith:selector asLowercase]).
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4232
            selector2InBest2 := (bestSelectors2 contains:[:sel | sel asLowercase startsWith:selector2 asLowercase]).
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4233
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4234
            (selectorInBest not and:[ selector2InBest2 ]) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4235
                "/ selector2 is more likely
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4236
                allBest := bestSelectors2
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4237
            ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4238
                (selectorInBest and:[ selector2InBest2 not ]) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4239
                    "/ selector more likely
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4240
                    allBest := bestSelectors
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4241
                ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4242
                    "/ assume same likelyness
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4243
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4244
                    allBest := bestSelectors isEmpty
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4245
                                ifTrue:[ bestSelectors2 ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4246
                                ifFalse:[ bestSelectors , #(nil) , bestSelectors2 ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4247
                ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4248
            ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4249
        ].
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4250
    ].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4251
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4252
    allBest isEmptyOrNil ifTrue:[ ^ self ].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4253
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4254
    split :=
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4255
        [:list :splitHow |
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4256
            |part1 part2 all|
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4257
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4258
            part1 := list select:splitHow.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4259
            part2 := list reject:splitHow.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4260
            part1 isEmpty ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4261
                all := part2.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4262
            ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4263
                part2 isEmpty ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4264
                    all := part1.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4265
                ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4266
                    all := part1 , part2.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4267
                ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4268
            ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4269
            all
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4270
        ].
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4271
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4272
    selectorsImplementedInClass notNil ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4273
        "/ the ones implemented in the receiver class are moved to the top of the list.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4274
        allBest := split value:allBest value:[:sel | selectorsImplementedInClass includes:sel].
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4275
    ].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4276
    selectorsSentInCode notNil ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4277
        "/ the ones already sent in the code are moved to the top of the list.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4278
        allBest := split value:allBest value:[:sel | selectorsSentInCode includes:sel].
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4279
    ].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4280
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4281
    "/ the ones which are a prefix are moved towards the top of the list
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4282
    allBest := split value:allBest value:[:sel | sel notNil and:[sel startsWith:selector]].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4283
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4284
    best := allBest first.
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4285
    allBest size > 1 ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4286
        "allBest size < 20 ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4287
            |idx|
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4288
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4289
            idx := (PopUpMenu labels:allBest) startUp.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4290
            idx == 0 ifTrue:[ ^ self].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4291
            best := allBest at:idx.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4292
        ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4293
            allBest remove:nil ifAbsent:[].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4294
            best := Dialog request:'Matching selectors:' initialAnswer:best list:allBest.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4295
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4296
        ]."
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4297
        allBest remove:nil ifAbsent:[].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4298
        best := self askUserForCompletion:('Selector for "%1"' bindWith:selector) for:codeView at: node selectorParts first start from:allBest.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4299
        best isEmptyOrNil ifTrue:[^ self].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4300
        best = '-' ifTrue:[^ self].
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4301
    ].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4302
4547
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  4303
"/    srchClass notNil ifTrue:[
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  4304
"/        implClass := srchClass whichClassIncludesSelector:best.
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  4305
"/    ] ifFalse:[
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  4306
"/        implClass := Smalltalk allClasses select:[:cls | (cls includesSelector:best) or:[cls class includesSelector:best]].
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  4307
"/        implClass size == 1 ifTrue:[
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  4308
"/            implClass := implClass first.
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  4309
"/        ] ifFalse:[
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  4310
"/            implClass := nil
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  4311
"/        ]
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  4312
"/    ].
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  4313
"/
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  4314
"/    info := best storeString.
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  4315
"/    implClass notNil ifTrue:[
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  4316
"/        info := implClass name , ' >> ' , info.
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  4317
"/    ].
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  4318
"/    self information:info.
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4319
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4320
    best ~= selector ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4321
        numArgs := best numArgs.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4322
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4323
        (bestSelectors2 notEmptyOrNil and:[bestSelectors2 includes:best]) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4324
            selectorParts := parentNode selectorParts , node selectorParts.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4325
        ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4326
            selectorParts := node selectorParts.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4327
        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4328
        nSelParts := selectorParts size.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4329
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4330
        newParts := best asCollectionOfSubstringsSeparatedBy:$:.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4331
        newParts := newParts select:[:part | part size > 0].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4332
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4333
        codeView
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4334
            undoableDo:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4335
                |newCursorPosition stop|
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4336
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4337
                numArgs > nSelParts ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4338
                    stop := selectorParts last stop.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4339
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4340
                    "/ append the rest ...
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4341
                    numArgs downTo:nSelParts+1 do:[:idx |
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4342
                        |newPart|
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4343
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4344
                        newPart := newParts at:idx.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4345
                        (best endsWith:$:) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4346
                            newPart := newPart , ':'
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4347
                        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4348
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4349
                        (codeView characterAtCharacterPosition:stop) == $: ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4350
                            newPart := ':' , newPart.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4351
                        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4352
                        newPart := (codeView characterAtCharacterPosition:stop) asString , newPart.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4353
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4354
                        codeView replaceFromCharacterPosition:stop to:stop with:newPart.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4355
                        newCursorPosition := stop + newPart size.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4356
                    ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4357
                ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4358
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4359
                (nSelParts min:newParts size) downTo:1 do:[:idx |
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4360
                    |newPart oldPartialToken start stop nextChar|
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4361
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4362
                    newPart := newParts at:idx.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4363
                    oldPartialToken := selectorParts at:idx.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4364
                    start := oldPartialToken start.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4365
                    stop := oldPartialToken stop.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4366
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4367
                    (best isKeywordSelector) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4368
                        (oldPartialToken value endsWith:$:) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4369
                            newPart := newPart , ':'
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4370
                        ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4371
                            (codeView characterAtCharacterPosition:stop+1) == $: ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4372
                                newPart := newPart , ':'
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4373
                            ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4374
                        ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4375
                    ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4376
                        (codeView characterAtCharacterPosition:stop) == $: ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4377
                            newPart := newPart , ':'
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4378
                        ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4379
                            nextChar := codeView characterAtCharacterPosition:stop+1.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4380
                            nextChar isSeparator ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4381
                                (').' includes:nextChar) ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4382
                                    newPart := newPart , ' '
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4383
                                ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4384
                            ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4385
                        ]
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4386
"/                            codeView replaceFromCharacterPosition:start to:stop with:(newPart , ':').
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4387
"/                        ] ifFalse:[
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4388
"/                            codeView replaceFromCharacterPosition:start to:stop with:newPart.
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4389
                    ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4390
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4391
                    codeView replaceFromCharacterPosition:start to:stop with:newPart.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4392
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4393
                    "/ codeView selectFromCharacterPosition:start+oldLen to:start+newLen-1.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4394
                    newCursorPosition isNil ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4395
                        oldLen := stop - start + 1.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4396
                        newLen := newPart size.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4397
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4398
                        newCursorPosition := stop + (newLen-oldLen)
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4399
                    ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4400
                ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4401
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4402
                codeView cursorToCharacterPosition:newCursorPosition.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4403
                codeView cursorRight.  "/ avoid going to the next line !!
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4404
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4405
                ((best endsWith:':') and:[numArgs == 1]) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4406
                    |impls impl|
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4407
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4408
                    "/ see if it expects a block argument (heuristic)
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4409
                    best := best asSymbol.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4410
                    (node notNil
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4411
                    and:[classOrNil notNil
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4412
                    and:[node receiver isSelf]]) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4413
                        (impl := classOrNil whichClassImplements:best) isNil ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4414
                            impls := #().
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4415
                            Screen current beep.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4416
                        ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4417
                            impls := { impl }
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4418
                        ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4419
                    ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4420
                        impls := Smalltalk allImplementorsOf:best.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4421
                    ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4422
                    (impls contains:[:cls |
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4423
                        |argName|
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4424
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4425
                        argName := ((cls compiledMethodAt:best) methodArgAndVarNames at:1) asLowercase.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4426
                        (argName includesString:'block') or:[ (argName includesString:'action')]]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4427
                    ) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4428
                        codeView insertStringAtCursor:'['
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4429
                    ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4430
                ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4431
                codeView dontReplaceSelectionOnInput.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4432
            ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4433
        info:'Completion'.
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4434
    ].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4435
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4436
    "Created: / 10-11-2006 / 13:18:27 / cg"
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4437
    "Modified: / 16-02-2010 / 10:33:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  4438
    "Modified: / 28-08-2013 / 15:27:32 / cg"
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4439
!
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4440
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4441
codeCompletionForVariable:node inClass:classOrNil codeView:codeView
4277
d55287081b53 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4276
diff changeset
  4442
    |parent nonMetaClass crsrPos nm
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4443
     allVariables allDistances best nodeVal
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4444
     char start stop oldLen newLen oldVar
4485
c6ed849af389 class: DoWhatIMeanSupport
Stefan Vogel <sv@exept.de>
parents: 4484
diff changeset
  4445
     getDistanceComputeBlockWithWeight addWithFactorBlock allTheBest bestAssoc
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4446
     globalFactor localFactor selectorOfMessageToNode tree implementors argIdx namesUsed kwPart|
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4447
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4448
    classOrNil notNil ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4449
	nonMetaClass := classOrNil theNonMetaclass.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4450
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4451
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4452
    nm := node name.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4453
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4454
    "/ if we are behind the variable and a space has already been entered,
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4455
    "/ the user is probably looking for a message selector.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4456
    "/ If the variable represents a global, present its instance creation messages
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4457
    crsrPos := codeView characterPositionOfCursor.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4458
    char := codeView characterAtCharacterPosition:crsrPos-1.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4459
    char isSeparator ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4460
	classOrNil isNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4461
	    nodeVal := Smalltalk at:nm asSymbol.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4462
	] ifFalse:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4463
	    nodeVal := classOrNil topNameSpace at:nm asSymbol ifAbsent:[Smalltalk at:nm asSymbol].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4464
	].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4465
	nodeVal isBehavior ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4466
	    |methods menu exitKey idx|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4467
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4468
	    methods := nodeVal class methodDictionary values
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4469
			    select:[:m | |cat|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4470
				cat := m category asLowercase.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4471
				cat = 'instance creation'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4472
			    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4473
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4474
	    menu := PopUpMenu labels:(methods collect:[:each | each selector]).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4475
	    menu hideOnKeyFilter:[:key | |hide|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4476
		    hide := ( #( CursorDown CursorUp Escape Return ) includes: key) not.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4477
		    hide ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4478
			exitKey := key.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4479
		    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4480
		    hide].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4481
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4482
	    idx := menu startUp.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4483
	    idx == 0 ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4484
		exitKey notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4485
		    codeView keyPress:exitKey x:0 y:0.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4486
		].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4487
		^ self
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4488
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4489
	    best := (methods at:idx) selector.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4490
	    codeView
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4491
		undoableDo:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4492
		    codeView insertString:best atCharacterPosition:crsrPos.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4493
		    codeView cursorToCharacterPosition:crsrPos+best size.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4494
		]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4495
		info:'completion'.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4496
	    ^ self.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4497
	].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4498
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4499
4277
d55287081b53 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4276
diff changeset
  4500
    ((parent := node parent) notNil and:[parent isMessage]) ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4501
	node == parent receiver ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4502
	    selectorOfMessageToNode := parent selector
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4503
	]
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4504
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4505
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4506
    getDistanceComputeBlockWithWeight :=
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4507
	[:weight |
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4508
	    [:each |
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4509
		|dist factor|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4510
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4511
		dist := each spellAgainst:nm.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4512
		factor := 1.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4513
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4514
		(each startsWith:nm) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4515
		    factor := 6 * nm size.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4516
		] ifFalse:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4517
		    (each asLowercase startsWith:nm asLowercase) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4518
			factor := 4 * nm size.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4519
		    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4520
		].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4521
		dist := dist + (weight*factor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4522
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4523
		each -> (dist * weight)
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4524
	     ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4525
	].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4526
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4527
    addWithFactorBlock :=
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4528
	[:eachNames :factor | |namesToAdd|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4529
	    namesToAdd := eachNames select:[:nameToAdd | nameToAdd ~= nm ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4530
	    namesToAdd := namesToAdd reject:[:each | allVariables includes:each ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4531
	    allVariables addAll:namesToAdd.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4532
	    allDistances addAll:(namesToAdd collect:(getDistanceComputeBlockWithWeight value:factor)).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4533
	].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4534
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4535
    nm isUppercaseFirst ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4536
	globalFactor := 2.    "/ favour globals
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4537
	localFactor := 1.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4538
    ] ifFalse:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4539
	globalFactor := 1.    "/ favour locals
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4540
	localFactor := 2.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4541
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4542
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4543
    allVariables := OrderedCollection new.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4544
    allDistances := OrderedCollection new.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4545
4308
f1c31624744d class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4304
diff changeset
  4546
    "/ are we in the method's selector spec ?
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4547
    ((parent := node parent) notNil
4277
d55287081b53 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4276
diff changeset
  4548
    and:[parent isMethod
d55287081b53 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4276
diff changeset
  4549
    and:[parent arguments includes:node]]) ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4550
	"/ now thats cool: look how the naem of this argument is in other implementations
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4551
	"/ of this method, and take that as a basis of the selection
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4552
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4553
	implementors := SystemBrowser
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4554
			    findImplementorsOf:(parent selector)
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4555
			    in:(Smalltalk allClasses)
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4556
			    ignoreCase:false.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4557
	"/ which argument is it
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4558
	argIdx := parent arguments indexOf:node.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4559
	implementors size > 50 ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4560
	    implementors := implementors asOrderedCollection copyTo:50.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4561
	].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4562
	namesUsed := implementors
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4563
			collect:[:eachImplementor |
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4564
			    |parseTree|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4565
			    parseTree := eachImplementor parseTree.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4566
			    (parseTree notNil and:[parseTree arguments size > 0])
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4567
				ifFalse:nil
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4568
				ifTrue:[ (parseTree arguments at:argIdx) name] ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4569
			thenSelect:[:a | a notNil] as:Set.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4570
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4571
	addWithFactorBlock value:namesUsed value:(2 * localFactor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4572
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4573
	classOrNil notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4574
	    "/ also, look for the keyword before the argument,
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4575
	    "/ and see if there is such an instVar
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4576
	    "/ if so, add it with -Arg
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4577
	    parent selector isKeyword ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4578
		kwPart := parent selector keywords at:argIdx.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4579
		(classOrNil allInstVarNames includes:(kwPart copyButLast:1)) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4580
		    addWithFactorBlock
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4581
			value:(classOrNil allInstVarNames collect:[:nm| nm,'Arg'])
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4582
			value:(1 * localFactor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4583
		].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4584
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4585
	]
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4586
    ] ifFalse:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4587
	classOrNil notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4588
	    "/ locals in the block/method
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4589
	    |names|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4590
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4591
	    names := node allVariablesOnScope.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4592
	    "/ if there were no variables (due to a parse error)
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4593
	    "/ do another parse and see what we have
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4594
	    names isEmpty ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4595
		tree := self treeForCode:(codeView contentsAsString string) allowErrors:true.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4596
		"/ better if we already have a body (include locals then)
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4597
		"/ otherwise, only the arguments are considered
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4598
		tree notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4599
		    names := (tree body ? tree) allVariablesOnScope.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4600
		]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4601
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4602
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4603
	    addWithFactorBlock value:names value:(4 * localFactor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4604
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4605
	    "/ instance variables
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4606
	    addWithFactorBlock value:classOrNil instVarNames value:(3 * localFactor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4607
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4608
	    "/ inherited instance variables
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4609
	    classOrNil superclass notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4610
		addWithFactorBlock value:classOrNil superclass allInstVarNames value:(2.5 * localFactor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4611
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4612
	].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4613
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4614
	selectorOfMessageToNode notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4615
	    |names responders nonResponders|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4616
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4617
	    "/ responding to that messsage
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4618
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4619
	    classOrNil notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4620
		"/ private classes
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4621
		addWithFactorBlock value:(nonMetaClass privateClasses collect:[:cls | cls nameWithoutPrefix])
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4622
				   value:(1.75 * globalFactor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4623
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4624
		"/ class variables
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4625
		names := nonMetaClass classVarNames.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4626
		responders := names select:[:classVar | (nonMetaClass classVarAt:classVar) respondsTo:selectorOfMessageToNode].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4627
		nonResponders := names reject:[:classVar | (nonMetaClass classVarAt:classVar) respondsTo:selectorOfMessageToNode].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4628
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4629
		addWithFactorBlock value:responders value:(1.5 * globalFactor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4630
		addWithFactorBlock value:nonResponders value:(0.5 * 1.5 * globalFactor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4631
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4632
		"/ superclass var names
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4633
		nonMetaClass allSuperclassesDo:[:superClass |
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4634
		    names := superClass classVarNames.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4635
		    responders := names select:[:classVar | (superClass classVarAt:classVar) respondsTo:selectorOfMessageToNode].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4636
		    nonResponders := names reject:[:classVar | (superClass classVarAt:classVar) respondsTo:selectorOfMessageToNode].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4637
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4638
		    addWithFactorBlock value:responders value:(1 * globalFactor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4639
		    addWithFactorBlock value:nonResponders value:(0.5 * 1 * globalFactor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4640
		].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4641
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4642
		"/ namespace vars
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4643
		classOrNil nameSpace ~~ Smalltalk ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4644
		    names := classOrNil topNameSpace keys.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4645
		    names := names reject:[:nm | nm includes:$:].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4646
		    names := names select:[:nm | nm isUppercaseFirst ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4647
		    responders := names select:[:nsVar | |c| c := classOrNil topNameSpace at:nsVar. c isBehavior not or:[c isLoaded and:[c respondsTo:selectorOfMessageToNode]]].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4648
		    nonResponders := names reject:[:nsVar | |c| c := classOrNil topNameSpace at:nsVar. c isBehavior not or:[c isLoaded and:[c respondsTo:selectorOfMessageToNode]]].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4649
		    addWithFactorBlock value:responders value:(1.5 * globalFactor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4650
		    addWithFactorBlock value:nonResponders value:(0.5 * 1.5 * globalFactor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4651
		].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4652
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4653
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4654
	    "/ globals
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4655
	    names := Smalltalk keys.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4656
	    "/ names := names reject:[:nm | nm includes:$:].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4657
	    names := names select:[:nm | nm isUppercaseFirst ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4658
	    responders := names select:[:glblVar | |c| c := Smalltalk at:glblVar. c isBehavior not or:[c isLoaded and:[c respondsTo:selectorOfMessageToNode]]].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4659
	    nonResponders := names reject:[:glblVar | |c| c := Smalltalk at:glblVar. c isBehavior not or:[c isLoaded and:[c respondsTo:selectorOfMessageToNode]]].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4660
	    addWithFactorBlock value:responders value:(1.5 * globalFactor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4661
	    addWithFactorBlock value:nonResponders value:(0.5 * 1.5 * globalFactor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4662
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4663
	    "/ pool variables
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4664
	    classOrNil theNonMetaclass sharedPoolNames do:[:poolName |
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4665
		|pool|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4666
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4667
		pool := Smalltalk at:poolName.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4668
		names := pool classVarNames.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4669
		names := names select:[:nm | nm isUppercaseFirst ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4670
		responders := names select:[:glblVar | |c| c := Smalltalk at:glblVar. c isBehavior not or:[c isLoaded and:[c respondsTo:selectorOfMessageToNode]]].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4671
		nonResponders := names reject:[:glblVar | |c| c := Smalltalk at:glblVar. c isBehavior not or:[c isLoaded and:[c respondsTo:selectorOfMessageToNode]]].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4672
		addWithFactorBlock value:responders value:(2.5 * globalFactor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4673
		addWithFactorBlock value:nonResponders value:(0.5 * 2.5 * globalFactor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4674
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4675
	] ifFalse:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4676
	    |names|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4677
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4678
	    classOrNil notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4679
		"/ private classes
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4680
		addWithFactorBlock value:(nonMetaClass privateClasses collect:[:cls | cls nameWithoutPrefix])
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4681
				   value:(1.75 * globalFactor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4682
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4683
		"/ class variables
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4684
		addWithFactorBlock value:nonMetaClass classVarNames value:(2.0 * globalFactor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4685
		classOrNil superclass notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4686
		    addWithFactorBlock value:nonMetaClass superclass allClassVarNames value:(2.0 * globalFactor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4687
		].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4688
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4689
		"/ namespace vars
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4690
		classOrNil nameSpace ~~ Smalltalk ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4691
		    names := classOrNil nameSpace isNameSpace ifTrue:[classOrNil nameSpace keys] ifFalse:[classOrNil nameSpace privateClasses collect:[:c | c nameWithoutPrefix]].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4692
		    names := names select:[:nm | nm isUppercaseFirst ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4693
		    addWithFactorBlock value:names value:(1.5 * globalFactor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4694
		].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4695
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4696
		"/ pool variables
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4697
		classOrNil theNonMetaclass sharedPoolNames do:[:poolName |
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4698
		    |pool|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4699
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4700
		    pool := Smalltalk at:poolName.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4701
		    names := pool classVarNames.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4702
		    addWithFactorBlock value:names value:(2.5 * globalFactor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4703
		].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4704
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4705
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4706
	    "/ globals
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4707
	    names := Smalltalk keys.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4708
	    names := names select:[:nm | nm isUppercaseFirst ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4709
	    addWithFactorBlock value:names value:(1.5 * globalFactor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4710
	].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4711
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4712
	"/ pseudos - assuming that thisContext is seldom used.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4713
	"/ also assuming, that nil is short so its usually typed in.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4714
	addWithFactorBlock value:#('self') value:(2.5 * localFactor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4715
	addWithFactorBlock value:#('nil') value:(0.5 * localFactor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4716
	addWithFactorBlock value:#('super' 'false') value:(2 * localFactor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4717
	addWithFactorBlock value:#('thisContext') value:(1 * localFactor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4718
	addWithFactorBlock value:#('true') value:(1 * localFactor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4719
	addWithFactorBlock value:#('false') value:(1 * localFactor).
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4720
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4721
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4722
    allDistances isEmpty ifTrue:[^ self].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4723
    bestAssoc := allDistances at:1.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4724
    bestAssoc := allDistances inject:bestAssoc into:[:el :best | el value > best value
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4725
							   ifTrue:[el]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4726
							   ifFalse:[best]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4727
						    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4728
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4729
    allDistances sort:[:a :b |
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4730
				a value > b value ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4731
				    true
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4732
				] ifFalse:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4733
				    a value = b value ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4734
					a key < b key
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4735
				    ] ifFalse:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4736
					false
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4737
				    ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4738
				]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4739
		      ].
4340
b7b73a78385a class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4339
diff changeset
  4740
    ((allTheBest := allDistances) count:[:entry | entry value]) > 20 ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4741
	allTheBest := allDistances select:[:entry | entry value >= (bestAssoc value * 0.5)].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4742
	allTheBest size > 15 ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4743
	    allTheBest := allDistances select:[:entry | entry value >= (bestAssoc value * 0.8)].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4744
	].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4745
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4746
4524
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  4747
    start := node start.
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  4748
    stop := node stop.
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  4749
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4750
    best := self askUserForCompletion:('Variable for "%1"' bindWith:node name)
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4751
		 for:codeView at: start
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4752
		 from:(allTheBest collect:[:assoc | assoc key]).
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4753
    best isNil ifTrue:[^ self].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4754
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4755
"/ self showInfo:best.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4756
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4757
    oldVar := (codeView textFromCharacterPosition:start to:stop) asString string withoutSeparators.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4758
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4759
    codeView
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4760
	undoableDo:[ codeView replaceFromCharacterPosition:start to:stop with:best ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4761
	info:'Completion'.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4762
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4763
    (best startsWith:oldVar) ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4764
	oldLen := stop - start + 1.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4765
	newLen := best size.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4766
	codeView selectFromCharacterPosition:start+oldLen to:start+newLen-1.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4767
	codeView dontReplaceSelectionOnInput
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4768
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4769
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4770
    "Created: / 10-11-2006 / 13:16:33 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4771
    "Modified: / 16-02-2010 / 10:13:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  4772
    "Modified: / 28-08-2013 / 15:37:28 / cg"
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4773
! !
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4774
3854
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  4775
!DoWhatIMeanSupport::InputCompletionResult class methodsFor:'instance creation'!
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  4776
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  4777
bestName:bestNameArg matchingNames:matchingNamesArg
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  4778
    ^ self with:bestNameArg with:matchingNamesArg
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  4779
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  4780
    "
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  4781
     self bestName:123 matchingNames:345
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  4782
    "
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  4783
! !
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  4784
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  4785
!DoWhatIMeanSupport::InputCompletionResult methodsFor:'accessing'!
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  4786
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  4787
bestName
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  4788
    ^ self at:1
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  4789
!
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  4790
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  4791
matchingNames
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  4792
    ^ self at:2
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  4793
! !
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  4794
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  4795
!DoWhatIMeanSupport class methodsFor:'documentation'!
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  4796
4281
05f2bc8ee7e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4280
diff changeset
  4797
version
4784
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  4798
    ^ '$Header$'
4281
05f2bc8ee7e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4280
diff changeset
  4799
!
05f2bc8ee7e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4280
diff changeset
  4800
3761
6584390d427d dont forget pool variables when looking for the best variable match
Claus Gittinger <cg@exept.de>
parents: 3751
diff changeset
  4801
version_CVS
4784
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  4802
    ^ '$Header$'
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  4803
! !
4194
e677aae984be Refactoring:
Stefan Vogel <sv@exept.de>
parents: 4148
diff changeset
  4804