[prev in list] [next in list] [prev in thread] [next in thread]
List: quanta-devel
Subject: Re: [quanta-devel] Class Variables - no attrAutoCompleteAfter patch
From: Andrew Lowe <andrew.lowe () manildra ! com ! au>
Date: 2007-02-16 6:23:50
Message-ID: 45D54DF6.7070808 () manildra ! com ! au
[Download RAW message or body]
Andras,
I have cleaned up the code, and implemented your suggestions.
Things should be pretty optimal, and I found some other ways to optimise...
Comments below inline...
Andras Mantia wrote:
>On Thursday 15 February 2007, Andrew Lowe wrote:
>
>
>>You may want to autocomplete function arguments as normal variables
>>ie. when you type '$', but you do not want them as class arguments
>>ie. after the '->' so I would think we just need to remove the
>>className?
>>That should already work. Actually that non-member autocompletion is
>>done in a different place, in the "group" autocompletion. Normal
>>variables are added to the "variable" group. The userTagsList is only
>>used for members. It is kind'a hack, but that is...
>>
>>
That makes more sense now.... removed class function arguments from the
userTagsList completly.
>
>
>>>In the completion code, I don't understand something. You set
>>>
>>>completion.type = type[tagNameList[i]];
>>>
>>>But this will be wrong for XML, as in case of XML, type is
>>>unitialized. Shouldn't this be moved inside the
>>>+ if(completionDTD->family==Script)
>>>?
>>>
>>>
>>>
>>>
>>Yes, so it should - which incidently is what I moved from inside the
>>if block, when I said I had found a mistake :-)
>>
>>
>
>I looked at your second patch and here there is:
>- completions->append( completion );
>+ /* Author Andrew Lowe - andrew.lowe@manildra.com.au
>+ * Here we actually append the completion type
>+ */
>+ completion.type = type[tagNameList[i]];
>+ if(completionDTD->family==Script)
>
>So I don't understand why you think its a mistake to have that statement
>inside the if block.
>
>
I originally put the code their by mistake, however, as you have pointed
out, it was correct to place it there... I wrote the code in the if
statement (sorting code) after putting the variable type in. I thought
it should be seperate because of this, however, as you point out, it
should be there, because it makes no for XML families..
I have fixed this also
Also in SAGroupParser::parseForScriptGroup where I am checking if the
variable is a function argument, I check if the tagStr contains an open
and closing paretheses '(' &')' because if they do not, there is no need
to run the loops to trim tagStr down to just one line, and test the
variable.
I also included the diff against svn for the
data/dtep/php/description.rc I forgot in earlier patches ( I was using
my ~.kde/share/apps/quanta/dtep/php/ folder until just now)
Thanks..
--
Andrew Lowe
System Administrator & Programmer
Information Technology
Manildra Group
Email: andrew.lowe@manildra.com.au
Phone: 02 4423 8270
Mobile: 04 1323 8270
Fax: 02 4421 7760
["class-completions.patch" (text/plain)]
Index: parsers/sagroupparser.cpp
===================================================================
--- parsers/sagroupparser.cpp (revision 633713)
+++ parsers/sagroupparser.cpp (working copy)
@@ -203,7 +203,9 @@
if (group.appendToTags)
{
QTag *qTag = new QTag();
- qTag->setName(s.left(s.find('(')));
+ // The location of the first open bracket '(', also the end of the tag \
name + int nameEnd = s.find('(');
+ qTag->setName(s.left(nameEnd));
qTag->className = "";
if (groupElement->parentNode)
{
@@ -216,7 +218,61 @@
}
}
}
- m_write->userTagList.insert(s.lower(), qTag);
+ // Test for variable or function Type by checking for an opening bracket \
"(" used by functions + // and store the type in the QTag type variable.
+ bool isArgument=false;
+ if (nameEnd == -1)
+ {
+ qTag->type="variable";
+ // If this tag is a class function argument, it should not belong to the \
class, so we need to remove it + if(qTag->className.length() != 0 && \
tagStr.contains('(') && tagStr.contains(')')) + {
+ // First we want to determine the whole line the tag is on
+ QString tagWholeLineStr = tagStr;
+ // Remove lines before target line
+ while(tagWholeLineStr.length() > 0) // this stops infinit looping in \
case something goes wrong! + {
+ int firstNewline = tagWholeLineStr.find('\n');
+ if(firstNewline == -1) //no new lines so we must be on the last
+ break;
+ QString checkLineStr = \
tagWholeLineStr.mid(firstNewline+1,tagWholeLineStr.length()); + \
if(checkLineStr.contains(s)) + tagWholeLineStr = checkLineStr;
+ else
+ break;
+ }
+ // Remove lines after target line - essentially same as above
+ while(tagWholeLineStr.length() > 0)
+ {
+ int lastNewLine = tagWholeLineStr.findRev('\n');
+ if(lastNewLine == -1)
+ break;
+ QString checkLineStr = tagWholeLineStr.mid(0,lastNewLine);
+ if(checkLineStr.contains(s))
+ tagWholeLineStr = checkLineStr;
+ else
+ break;
+ }
+ // Now we are left with the current line, lets check if the variable is \
inside parentheses + int lineOpenParenth=tagWholeLineStr.find('(');
+ if(lineOpenParenth != -1)
+ {
+ int lineCloseParenth=tagWholeLineStr.find(')');
+ if(lineCloseParenth != -1)
+ {
+ int lineNameLocation=tagWholeLineStr.find(s);
+ if(lineNameLocation > lineOpenParenth || lineNameLocation < \
lineCloseParenth) // Write the current tag to the list + \
isArgument=true; + }
+ }
+ }
+ }
+ else
+ {
+ qTag->type="function";
+ }
+ if(!isArgument)
+ m_write->userTagList.insert(s.lower(), qTag);
}
Index: src/document.cpp
===================================================================
--- src/document.cpp (revision 633713)
+++ src/document.cpp (working copy)
@@ -1285,6 +1285,8 @@
completion.userdata = word + "|";
QStringList tagNameList;
QMap<QString, QString> comments;
+ //A QMap to hold the completion type (function/string/class/etc)
+ QMap<QString, QString> type;
QString tagName;
QDictIterator<QTag> it(*(completionDTD->tagsList));
int i = 0;
@@ -1318,11 +1320,36 @@
tagName = tag->name() + QString("%1").arg(i, 10);
tagNameList += tagName;
comments.insert(tagName, tag->comment);
- i++;
+
+ // If the completion family is script, then we want to update the tag type
+ // it appears we use "script" for adding the \
completionDTD->attrAutoCompleteAfter when we run the slotFilterCompletion + // \
so we will continue to use that for functions (they need the attribute added), but \
variables get a new type - and we do not + // have to auto-complete them
+ if(completionDTD->family==Script)
+ {
+ if(tag->type=="variable")
+ type.insert(tagName, tag->type);
+ else if(tag->type=="function")
+ type.insert(tagName, "script");
+
+ // We add the type to the comment variable, so it displays on the screen, \
giving the user some feedback + if(comments[tagName].length())
+ comments[tagName] = tag->type + "\n" + comments[tagName];
+ else
+ comments[tagName] = tag->type + comments[tagName];
+ i++;
+ }
}
}
tagNameList.sort();
+ // tagNameList is sorted above to sort the completions by name alphabetically
+ // Now we want to sort the completions by their types.
+ // We only want to do this if we are completing Script DTDs
+ // We are going to use a couple of iterators to sort the list by Type
+ // Type Sorting is as follows: 0:Other, 1:Variables, 2: Functions (script)
+ QValueList<KTextEditor::CompletionEntry>::Iterator otherIt=completions->begin();
+ QValueList<KTextEditor::CompletionEntry>::Iterator \
variableIt=completions->begin(); for (uint i = 0; i < tagNameList.count(); i++)
{
if (completionDTD->family == Xml)
@@ -1331,10 +1358,42 @@
completion.text = tagNameList[i];
completion.text = completion.text.left(completion.text.length() - \
10).stripWhiteSpace(); completion.comment = comments[tagNameList[i]];
- completions->append( completion );
+
+ if(completionDTD->family==Script)
+ {
+ // Here we actually append the completion type
+ completion.type = type[tagNameList[i]];
+ // And here is out sorting...
+ if(completion.type.contains("variable"))
+ {
+ // Insert after the last variable
+ variableIt++;
+ variableIt = completions->insert(variableIt, completion);
+ }
+ else
+ {
+ if(completion.type.contains("script"))
+ {
+ //Scripts can go at the end of the list
+ completions->append(completion);
+ }
+ else
+ {
+ // Other types go first, after the last other type
+ otherIt++;
+ otherIt = completions->insert(otherIt, completion);
+ // If we have no variables in the list, we need to point variableIt to \
otherIt, so they will go after the 'others' + \
if((*variableIt).text.length()==0) + variableIt=otherIt;
+ }
+ }
+ }
+ else
+ completions->append( completion );
}
// completionInProgress = true;
+
return completions;
}
Index: data/dtep/php/description.rc
===================================================================
--- data/dtep/php/description.rc (revision 633713)
+++ data/dtep/php/description.rc (working copy)
@@ -50,6 +50,8 @@
DefinitionRx = \$+([a-zA-Z0-9_\x7f-\xff]*[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)
UsageRx = \$+([a-zA-Z0-9_\x7f-\xff]*[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)
AutoCompleteAfter = \$+[a-zA-Z0-9_\x7f-\xff]*$
+AppendToTags = true
+ParentGroup = Classes
[StructGroup_3]
Name = Functions
_______________________________________________
quanta-devel mailing list
quanta-devel@kde.org
https://mail.kde.org/mailman/listinfo/quanta-devel
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic