[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    playground/devtools/kdevelop4-extra-plugins/java
From:       Hamish Rodda <rodda () kde ! org>
Date:       2009-12-02 9:50:26
Message-ID: 1259747426.783766.11852.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 1057398 by rodda:

Protect KZip object from multithreaded access with a mutex - fixes race condition \
crashes Improve type builder to register types for function arguments and add them to \
the function type Resolve functions from the correct context

Now the uses of functions start to be resolved correctly

 M  +29 -6     duchain/expressionvisitor.cpp  
 M  +10 -0     duchain/typebuilder.cpp  
 M  +1 -0      duchain/typebuilder.h  
 M  +6 -2      duchain/viablefunctions.cpp  
 M  +7 -0      javalanguagesupport.cpp  
 M  +3 -0      javalanguagesupport.h  
 M  +1 -0      parsejob.cpp  


--- trunk/playground/devtools/kdevelop4-extra-plugins/java/duchain/expressionvisitor.cpp \
#1057397:1057398 @@ -378,10 +378,25 @@
   DeclarationPointer useDecl;
   AstNode* useNode = 0;
 
-  if (lastInstance().isInstance) {
+  if (lastInstance().declaration) {
     if (node->methodName) {
       QualifiedIdentifier id = identifierForNode(node->methodName);
-
+      DUContextPointer searchContext;
+      {
+        DUChainReadLocker lock(DUChain::lock());
+        StructureType::Ptr classType = \
lastInstance().declaration->type<StructureType>(); +        if (!classType) {
+            kDebug() << "Type of last instance " << \
lastInstance().declaration->toString() << "was not a structure."; +            \
return; +        }
+        searchContext = classType->internalContext(currentContext()->topContext());
+        if (!searchContext) {
+          kDebug() << "could not find internal context for the structure type of the \
class to be searched"; +          return;
+        }
+        kDebug() << "Looking for function" << id << "in" << \
searchContext->scopeIdentifier(true); +      }
+      
       QList<OverloadResolver::Parameter> parameters;
 
       if (node->arguments && node->arguments->expressionSequence)
@@ -391,7 +406,10 @@
           {
               visitNode(__it->element);
               // TODO determine l-value-ness if required
-              parameters.append(OverloadResolver::Parameter(lastType(), false));
+              if (lastType()) {
+                kDebug() << "Parameter" << lastType()->toString();
+                parameters.append(OverloadResolver::Parameter(lastType(), false));
+              }
               
               __it = __it->next;
           }
@@ -400,18 +418,20 @@
 
       
       DUChainReadLocker lock(DUChain::lock());
-      KDevelop::DUContextPointer currentContextPtr(currentContext());
-      OverloadResolver resolver(currentContextPtr);
+      OverloadResolver resolver(searchContext);
+      //kDebug() << "Parameter count:" << parameters.count();
       useDecl = resolver.resolve(OverloadResolver::ParameterList(parameters), id);
       if (useDecl)
         useNode = node->methodName;
+
+      kDebug() << "result" << (useDecl ? useDecl->toString() : "null declaration") \
<< useNode;  }
 
     if (useNode)
       usingDeclaration(useNode, useDecl);
 
   } else {
-    kDebug() << "No instance on which to invoke a method";
+    kDebug() << "No declaration for the last instance on which to invoke a method";
   }
 }
 
@@ -574,6 +594,9 @@
     }
   }
 
+  if (node->methodCall)
+    visitNode(node->methodCall);
+
   if (useNode)
     usingDeclaration(useNode, useDecl);
 }
--- trunk/playground/devtools/kdevelop4-extra-plugins/java/duchain/typebuilder.cpp \
#1057397:1057398 @@ -82,6 +82,16 @@
   closeType();
 }
 
+
+void TypeBuilder::visitParameterDeclarationEllipsis(ParameterDeclarationEllipsisAst* \
node) +{
+  TypeBuilderBase::visitParameterDeclarationEllipsis(node);
+  
+  if (hasCurrentType())
+    if (FunctionType::Ptr function = currentType<FunctionType>())
+      function->addArgument(lastType());
+}
+
 void TypeBuilder::visitInterfaceMethodDeclaration(InterfaceMethodDeclarationAst * \
node)  {
   clearLastType();
--- trunk/playground/devtools/kdevelop4-extra-plugins/java/duchain/typebuilder.h \
#1057397:1057398 @@ -55,6 +55,7 @@
   virtual void visitEnumConstant(EnumConstantAst* node);
 
   virtual void visitMethodDeclaration(MethodDeclarationAst *node);
+  virtual void visitParameterDeclarationEllipsis(ParameterDeclarationEllipsisAst* \
node);  virtual void visitInterfaceMethodDeclaration(InterfaceMethodDeclarationAst * \
node);  virtual void visitConstructorDeclaration(ConstructorDeclarationAst *node);
   virtual void visitInterfaceDeclaration(InterfaceDeclarationAst *node);
--- trunk/playground/devtools/kdevelop4-extra-plugins/java/duchain/viablefunctions.cpp \
#1057397:1057398 @@ -60,10 +60,14 @@
   
   uint functionArgumentCount = m_type->indexedArgumentsSize();
   
-  if( params.parameters.size() + m_funDecl->defaultParametersSize() < \
functionArgumentCount && !partial ) +  if( params.parameters.size() + \
m_funDecl->defaultParametersSize() < functionArgumentCount && !partial ) { +    \
//kDebug() << "Not enough parameters + default-parameters";  return; //Not enough \
                parameters + default-parameters
-  if( params.parameters.size() > functionArgumentCount )
+  }
+  if( params.parameters.size() > functionArgumentCount ) {
+    //kDebug() << "Too many parameters" << params.parameters.size() << "gt" << \
functionArgumentCount;  return; //Too many parameters
+  }
 
   m_parameterCountMismatch = false;
   //Match all parameters against the argument-type
--- trunk/playground/devtools/kdevelop4-extra-plugins/java/javalanguagesupport.cpp \
#1057397:1057398 @@ -69,6 +69,7 @@
         : KDevelop::IPlugin( KDevJavaSupportFactory::componentData(), parent )
         , KDevelop::ILanguageSupport()
         , m_allJavaContext(0)
+        , m_javaSourceZipMutex(new QMutex())
         , m_javaSourceZip(0)
 {
     s_self = this;
@@ -166,6 +167,12 @@
     return m_javaSourceZip;
 }
 
+
+QMutex* JavaLanguageSupport::javaSourceZipMutex() const
+{
+    return m_javaSourceZipMutex;
+}
+
 KDevelop::ReferencedTopDUContext JavaLanguageSupport::allJavaContext()
 {
     if (m_allJavaContext)
--- trunk/playground/devtools/kdevelop4-extra-plugins/java/javalanguagesupport.h \
#1057397:1057398 @@ -64,6 +64,7 @@
 
     static JavaLanguageSupport* self();
 
+    QMutex* javaSourceZipMutex() const;
     KZip* javaSourceZip() const;
 
 private Q_SLOTS:
@@ -75,7 +76,9 @@
     KDevelop::CodeHighlighting* m_highlighting;
     KDevelop::ReferencedTopDUContext m_allJavaContext;
     KUrl m_javaSourceUrl;
+    QMutex* m_javaSourceZipMutex;
     mutable KZip* m_javaSourceZip;
+    
 
     static JavaLanguageSupport* s_self;
 };
--- trunk/playground/devtools/kdevelop4-extra-plugins/java/parsejob.cpp \
#1057397:1057398 @@ -149,6 +149,7 @@
             int offset = filePath.indexOf(".zip");
 
             // TODO - add logic to detect if we should create a new zip object \
(non-jdk-source-zip) or not +            QMutexLocker \
lock(java()->javaSourceZipMutex());  KZip* zip = java()->javaSourceZip();
             if(zip)//->open(QIODevice::ReadOnly))
             {


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic