{ if (thread1.equals(thread2)) { return true; } // Allow @UiThread and @MainThread to be combined if (thread1.equals(UI_THREAD_ANNOTATION)) { if (thread2.equals(MAIN_THREAD_ANNOTATION)) { return true; } } else if (thread1.equals(MAIN_THREAD_ANNOTATION)) { if (thread2.equals(UI_THREAD_ANNOTATION)) { return true; } } return false; } thread1thread2ʹMainThreadͳͲͷจࣈྻ͕ೖ͍ͬͯ·͢
{ if (thread1.equals(thread2)) { return true; } // Allow @UiThread and @MainThread to be combined if (thread1.equals(UI_THREAD_ANNOTATION)) { if (thread2.equals(MAIN_THREAD_ANNOTATION)) { return true; } } else if (thread1.equals(MAIN_THREAD_ANNOTATION)) { if (thread2.equals(UI_THREAD_ANNOTATION)) { return true; } } return false; } ಉ͡ͳΒ͙͢ʹtrueΛฦ͠·͢
{ if (thread1.equals(thread2)) { return true; } // Allow @UiThread and @MainThread to be combined if (thread1.equals(UI_THREAD_ANNOTATION)) { if (thread2.equals(MAIN_THREAD_ANNOTATION)) { return true; } } else if (thread1.equals(MAIN_THREAD_ANNOTATION)) { if (thread2.equals(UI_THREAD_ANNOTATION)) { return true; } } return false; } MainThreadͱUIThreadಉ͡ѻ͍Λ͠ɺଞҟͳΔͷͰfalseΛฦ͠·͢
PsiTreeUtil.getParentOfType(methodCall, PsiMethod.class, true); if (method != null) { …… // See if we're extending a class with a known threading context PsiClass cls = method.getContainingClass(); if (cls != null) { annotations = getAllAnnotations(cls); for (PsiAnnotation annotation : annotations) { String qualifiedName = annotation.getQualifiedName(); if (qualifiedName == null) { continue; } if (qualifiedName.startsWith(SUPPORT_ANNOTATIONS_PREFIX) && qualifiedName.endsWith(THREAD_SUFFIX)) { return qualifiedName; } } } } getThreadContext (2/2) @Nullable private static PsiMethod method = PsiTreeUtil.getParentOfType(methodCall if …… // See if we're extending a class with a known threading context PsiClass cls = method.getContainingClass() if annotations = getAllAnnotations(cls) for String qualifiedName = annotation.getQualifiedName() if } } } ͦΕ͚ͩͰͳ͘ɺΫϥεʹ͍͍ͭͯΔΞϊςʔγϣϯΛऔಘ͠·͢
String qualifiedName) { String threadContext = getThreadContext(methodCall); if (threadContext != null && !isCompatibleThread(threadContext, qualifiedName)) { String message = String.format("Method %1$s must be called from the %2$s thread, currently inferred thread is %3$s", method.getName(), describeThread(qualifiedName), describeThread(threadContext)); holder.registerProblem(methodCall, message); } } ͭ·Γݺͼग़͠ݩͷϝιουͱΫϥεͷΞϊςʔγϣϯΛݟ͍ͯ·͢