public static O2MethodStream map_IMethod_Dependencies(this O2MethodStream o2MethodStream, IMethod iMethod)
        {
            if (O2MethodStream_ExtensionMethods.O2MethodStreamCache.hasKey(iMethod))
            {
                "Found IMethod in O2MethodStreamCache(merging its data with the current o2MethodStream): {0}".debug(iMethod.DotNetName);
                o2MethodStream.add_O2MethodStreamMappings(O2MethodStream_ExtensionMethods.O2MethodStreamCache[iMethod]);
                return(o2MethodStream);
            }
            // map the methods called
            INode methodOrCtorINode = o2MethodStream.O2MappedAstData.methodDeclaration(iMethod);

            if (methodOrCtorINode.isNull())
            {
                methodOrCtorINode = o2MethodStream.O2MappedAstData.constructorDeclaration(iMethod);
            }

            if (methodOrCtorINode.notNull())
            {
                o2MethodStream.map_MemberReferenceExpressions(methodOrCtorINode)
                .map_ObjectCreateExpressions(methodOrCtorINode)
                .map_InvocationExpressions(methodOrCtorINode)
                .map_Expressions(methodOrCtorINode.iNodes <INode, IdentifierExpression>());

                // this is not working (the idea is to map the chained ctors

                /*
                 *
                 * if (methodOrCtorINode is ConstructorDeclaration)
                 * {
                 *  var constructorDeclaration = (ConstructorDeclaration)methodOrCtorINode;
                 *  if (constructorDeclaration.ConstructorInitializer.notNull())
                 *  {
                 *      //var iMethodOfConstructorInitializer = o2MethodStream.fromExpressionGetIMethod(constructorDeclaration.ConstructorInitializer);
                 *      //if (iMethodOfConstructorInitializer.notNull())
                 *      //    o2MethodStream.add_IMethod(iMethodOfConstructorInitializer);
                 *  }
                 * }
                 */
            }

/*            var methodDeclaration = o2MethodStream.O2MappedAstData.methodDeclaration(iMethod);
 *          if (methodDeclaration != null)
 *          {
 *                              o2MethodStream
 *                            .map_MemberReferenceExpressions(methodDeclaration)
 *                            .map_ObjectCreateExpressions(methodDeclaration)
 *                            .map_InvocationExpressions(methodDeclaration)
 *                            .map_Expressions(methodDeclaration.iNodes<INode, IdentifierExpression>());
 *          }*/
            // map the external classes
            o2MethodStream.map_ExternalClasses(iMethod);
            return(o2MethodStream);
        }