mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
Merge remote branch 'origin/master'
This commit is contained in:
@@ -263,7 +263,8 @@ public class InspectionProfileTest extends LightIdeaTestCase {
|
||||
profile.enableTool(id);
|
||||
}
|
||||
profile.writeExternal(new Element("profile"));
|
||||
assertEquals(1, countInitializedTools(profile));
|
||||
List<InspectionProfileEntry> initializedTools = getInitializedTools(profile);
|
||||
assertEquals(initializedTools.toString(), 1, initializedTools.size());
|
||||
}
|
||||
|
||||
public void testInspectionInitializationForSerialization() throws Exception {
|
||||
|
||||
+5
-2
@@ -56,9 +56,12 @@ public abstract class ArtifactCompilerInstructionCreatorBase implements Artifact
|
||||
|
||||
@Override
|
||||
public void addExtractDirectoryInstruction(@NotNull File jarFile, @NotNull String pathInJar) {
|
||||
final boolean copyExcluded = myInstructionsBuilder.getRootsIndex().isExcluded(jarFile);
|
||||
//an entry of a jar file is excluded if and only if the jar file itself is excluded. In that case we should unpack entries to the artifact
|
||||
// because the jar itself is explicitly added to the artifact layout.
|
||||
boolean includeExcluded = true;
|
||||
|
||||
final SourceFileFilterImpl filter = new SourceFileFilterImpl(null, myInstructionsBuilder.getRootsIndex(),
|
||||
myInstructionsBuilder.getIgnoredFileIndex(), copyExcluded);
|
||||
myInstructionsBuilder.getIgnoredFileIndex(), includeExcluded);
|
||||
DestinationInfo destination = createDirectoryDestination();
|
||||
if (destination != null) {
|
||||
ArtifactRootDescriptor descriptor = myInstructionsBuilder.createJarBasedRoot(jarFile, pathInJar, filter, destination);
|
||||
|
||||
@@ -73,9 +73,7 @@ public class AndroidDexBuilder extends TargetBuilder<BuildRootDescriptor, Androi
|
||||
@NotNull DirtyFilesHolder<BuildRootDescriptor, AndroidDexBuildTarget> holder,
|
||||
@NotNull BuildOutputConsumer outputConsumer,
|
||||
@NotNull CompileContext context) throws ProjectBuildException, IOException {
|
||||
if (AndroidJpsUtil.isLightBuild(context)) {
|
||||
return;
|
||||
}
|
||||
assert !AndroidJpsUtil.isLightBuild(context);
|
||||
|
||||
try {
|
||||
if (!doDexBuild(buildTarget, context, holder.hasDirtyFiles())) {
|
||||
@@ -97,10 +95,7 @@ public class AndroidDexBuilder extends TargetBuilder<BuildRootDescriptor, Androi
|
||||
|
||||
final JpsAndroidModuleExtension extension = AndroidJpsUtil.getExtension(module);
|
||||
assert extension != null;
|
||||
if (extension.isLibrary()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
assert !extension.isLibrary();
|
||||
|
||||
final AndroidPlatform platform = AndroidJpsUtil.getAndroidPlatform(module, context, DEX_BUILDER_NAME);
|
||||
if (platform == null) {
|
||||
|
||||
+9
-4
@@ -87,7 +87,7 @@ public class AndroidPackagingBuilder extends TargetBuilder<BuildRootDescriptor,
|
||||
throw new ProjectBuildException();
|
||||
}
|
||||
|
||||
if (!doPackaging(context, modules)) {
|
||||
if (!doPackaging(context, modules, outputConsumer)) {
|
||||
throw new ProjectBuildException();
|
||||
}
|
||||
}
|
||||
@@ -315,7 +315,9 @@ public class AndroidPackagingBuilder extends TargetBuilder<BuildRootDescriptor,
|
||||
return success;
|
||||
}
|
||||
|
||||
private static boolean doPackaging(@NotNull CompileContext context, @NotNull Collection<JpsModule> modules) throws IOException {
|
||||
private static boolean doPackaging(@NotNull CompileContext context,
|
||||
@NotNull Collection<JpsModule> modules,
|
||||
@NotNull BuildOutputConsumer outputConsumer) throws IOException {
|
||||
final boolean release = AndroidJpsUtil.isReleaseBuild(context);
|
||||
final File dataStorageRoot = context.getProjectDescriptor().dataManager.getDataPaths().getDataStorageRoot();
|
||||
|
||||
@@ -332,7 +334,8 @@ public class AndroidPackagingBuilder extends TargetBuilder<BuildRootDescriptor,
|
||||
|
||||
for (JpsModule module : modules) {
|
||||
try {
|
||||
if (!doPackagingForModule(context, module, apkFileSetStorage, apkBuilderConfigStateStorage, release)) {
|
||||
if (!doPackagingForModule(context, module, apkFileSetStorage, apkBuilderConfigStateStorage,
|
||||
release, outputConsumer)) {
|
||||
success = false;
|
||||
}
|
||||
}
|
||||
@@ -359,7 +362,8 @@ public class AndroidPackagingBuilder extends TargetBuilder<BuildRootDescriptor,
|
||||
@NotNull JpsModule module,
|
||||
@NotNull AndroidFileSetStorage apkFileSetStorage,
|
||||
@NotNull AndroidApkBuilderConfigStateStorage apkBuilderConfigStateStorage,
|
||||
boolean release) throws IOException {
|
||||
boolean release,
|
||||
@NotNull BuildOutputConsumer outputConsumer) throws IOException {
|
||||
final JpsAndroidModuleExtension extension = AndroidJpsUtil.getExtension(module);
|
||||
if (extension == null || extension.isLibrary()) {
|
||||
return true;
|
||||
@@ -435,6 +439,7 @@ public class AndroidPackagingBuilder extends TargetBuilder<BuildRootDescriptor,
|
||||
final File dst = new File(
|
||||
AndroidCommonUtils.addSuffixToFileName(outputPath, AndroidCommonUtils.ANDROID_FINAL_PACKAGE_FOR_ARTIFACT_SUFFIX));
|
||||
FileUtil.copy(new File(outputApkPath), dst);
|
||||
outputConsumer.registerOutputFile(dst, Collections.<String>emptyList());
|
||||
}
|
||||
AndroidJpsUtil.addMessages(context, messages, BUILDER_NAME, module.getName());
|
||||
final boolean success = messages.get(AndroidCompilerMessageKind.ERROR).isEmpty();
|
||||
|
||||
+27
-7
@@ -31,12 +31,19 @@ import java.util.List;
|
||||
/**
|
||||
* @author nik
|
||||
*/
|
||||
public abstract class AndroidBuildTarget extends ModuleBasedTarget<BuildRootDescriptor> {
|
||||
public abstract class AndroidBuildTarget extends BuildTarget<BuildRootDescriptor> {
|
||||
private final AndroidBuildTargetType myTargetType;
|
||||
protected final JpsModule myModule;
|
||||
|
||||
public AndroidBuildTarget(@NotNull AndroidBuildTargetType targetType, @NotNull JpsModule module) {
|
||||
super(targetType, module);
|
||||
super(targetType);
|
||||
myTargetType = targetType;
|
||||
myModule = module;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public JpsModule getModule() {
|
||||
return myModule;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -67,11 +74,6 @@ public abstract class AndroidBuildTarget extends ModuleBasedTarget<BuildRootDesc
|
||||
return "Android " + myTargetType.getPresentableName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isTests() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public BuildRootDescriptor findRootDescriptor(String rootId, BuildRootIndex rootIndex) {
|
||||
@@ -82,4 +84,22 @@ public abstract class AndroidBuildTarget extends ModuleBasedTarget<BuildRootDesc
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) {
|
||||
return true;
|
||||
}
|
||||
if (o == null || !(o instanceof AndroidBuildTarget)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
AndroidBuildTarget target = (AndroidBuildTarget)o;
|
||||
return getTargetType() == target.getTargetType() && getId().equals(target.getId());
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return 31 * getId().hashCode() + getTargetType().hashCode();
|
||||
}
|
||||
}
|
||||
|
||||
+23
-2
@@ -1,7 +1,10 @@
|
||||
package org.jetbrains.jps.android.builder;
|
||||
|
||||
import com.intellij.openapi.util.io.FileUtil;
|
||||
import org.jetbrains.android.util.AndroidCommonUtils;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.jps.android.AndroidJpsUtil;
|
||||
import org.jetbrains.jps.android.model.JpsAndroidModuleExtension;
|
||||
import org.jetbrains.jps.builders.BuildRootDescriptor;
|
||||
import org.jetbrains.jps.builders.BuildTarget;
|
||||
import org.jetbrains.jps.builders.storage.BuildDataPaths;
|
||||
@@ -36,12 +39,30 @@ public class AndroidPackagingBuildTarget extends AndroidBuildTarget {
|
||||
@NotNull
|
||||
@Override
|
||||
public Collection<File> getOutputRoots(CompileContext context) {
|
||||
return Collections.emptyList();
|
||||
final File moduleOutputDir = context.getProjectPaths().getModuleOutputDir(myModule, false);
|
||||
final JpsAndroidModuleExtension extension = AndroidJpsUtil.getExtension(myModule);
|
||||
|
||||
if (moduleOutputDir == null || extension == null) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
final String outputPath = AndroidJpsUtil.getApkPath(extension, moduleOutputDir);
|
||||
|
||||
if (outputPath == null) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
final String afpFile = AndroidCommonUtils.addSuffixToFileName(
|
||||
outputPath, AndroidCommonUtils.ANDROID_FINAL_PACKAGE_FOR_ARTIFACT_SUFFIX);
|
||||
return Collections.singletonList(new File(FileUtil.toSystemDependentName(afpFile)));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void fillDependencies(List<BuildTarget<?>> result) {
|
||||
result.add(new AndroidDexBuildTarget(myModule));
|
||||
final JpsAndroidModuleExtension extension = AndroidJpsUtil.getExtension(myModule);
|
||||
|
||||
if (extension != null && !extension.isLibrary()) {
|
||||
// todo: remove this when AndroidPackagingBuilder will be fully target-based
|
||||
result.add(new AndroidDexBuildTarget(myModule));
|
||||
}
|
||||
}
|
||||
|
||||
public static class MyTargetType extends AndroidBuildTargetType<AndroidPackagingBuildTarget> {
|
||||
|
||||
@@ -337,6 +337,7 @@
|
||||
<codeStyleSettingsProvider implementation="org.jetbrains.android.formatter.AndroidXmlCodeStyleSettingsProvider"/>
|
||||
<predefinedCodeStyle implementation="org.jetbrains.android.formatter.AndroidXmlPredefinedCodeStyle"/>
|
||||
<editorNotificationProvider implementation="org.jetbrains.android.formatter.AndroidCodeStyleNotificationProvider"/>
|
||||
<compiler.buildTargetScopeProvider implementation="org.jetbrains.android.compiler.AndroidBuildTargetScopeProvider"/>
|
||||
</extensions>
|
||||
|
||||
<extensionPoints>
|
||||
|
||||
+55
@@ -0,0 +1,55 @@
|
||||
package org.jetbrains.android.compiler;
|
||||
|
||||
import com.intellij.compiler.impl.BuildTargetScopeProvider;
|
||||
import com.intellij.facet.ProjectFacetManager;
|
||||
import com.intellij.openapi.compiler.CompileScope;
|
||||
import com.intellij.openapi.compiler.CompilerFilter;
|
||||
import com.intellij.openapi.module.Module;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import org.jetbrains.android.facet.AndroidFacet;
|
||||
import org.jetbrains.android.util.AndroidCommonUtils;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import static org.jetbrains.jps.api.CmdlineRemoteProto.Message.ControllerMessage.ParametersMessage.TargetTypeBuildScope;
|
||||
|
||||
/**
|
||||
* @author Eugene.Kudelevsky
|
||||
*/
|
||||
public class AndroidBuildTargetScopeProvider extends BuildTargetScopeProvider {
|
||||
@NotNull
|
||||
@Override
|
||||
public List<TargetTypeBuildScope> getBuildTargetScopes(
|
||||
@NotNull CompileScope baseScope, @NotNull CompilerFilter filter, @NotNull Project project) {
|
||||
|
||||
if (!ProjectFacetManager.getInstance(project).hasFacets(AndroidFacet.ID)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
final List<String> dexTargetIds = new ArrayList<String>();
|
||||
final List<String> packagingTargetIds = new ArrayList<String>();
|
||||
final boolean fullBuild = AndroidCompileUtil.isFullBuild(baseScope);
|
||||
|
||||
for (Module module : baseScope.getAffectedModules()) {
|
||||
final AndroidFacet facet = AndroidFacet.getInstance(module);
|
||||
|
||||
if (facet == null) {
|
||||
continue;
|
||||
}
|
||||
// todo: make AndroidPackagingBuilder fully target-based and change this
|
||||
packagingTargetIds.add(module.getName());
|
||||
|
||||
if (fullBuild && !facet.getConfiguration().LIBRARY_PROJECT) {
|
||||
dexTargetIds.add(module.getName());
|
||||
}
|
||||
}
|
||||
return Arrays.asList(
|
||||
TargetTypeBuildScope.newBuilder().setTypeId(AndroidCommonUtils.DEX_BUILD_TARGET_TYPE_ID).
|
||||
addAllTargetId(dexTargetIds).build(),
|
||||
TargetTypeBuildScope.newBuilder().setTypeId(AndroidCommonUtils.PACKAGING_BUILD_TARGET_TYPE_ID).
|
||||
addAllTargetId(packagingTargetIds).build());
|
||||
}
|
||||
}
|
||||
@@ -19,6 +19,7 @@ import com.intellij.compiler.CompilerConfiguration;
|
||||
import com.intellij.compiler.CompilerConfigurationImpl;
|
||||
import com.intellij.compiler.CompilerWorkspaceConfiguration;
|
||||
import com.intellij.compiler.options.CompileStepBeforeRun;
|
||||
import com.intellij.compiler.server.BuildManager;
|
||||
import com.intellij.facet.ProjectFacetManager;
|
||||
import com.intellij.openapi.application.ApplicationManager;
|
||||
import com.intellij.openapi.application.ModalityState;
|
||||
@@ -72,6 +73,11 @@ public class AndroidPrecompileTask implements CompileTask {
|
||||
public boolean execute(CompileContext context) {
|
||||
final Project project = context.getProject();
|
||||
|
||||
if (!ProjectFacetManager.getInstance(project).hasFacets(AndroidFacet.ID)) {
|
||||
return true;
|
||||
}
|
||||
BuildManager.forceModelLoading(context);
|
||||
|
||||
// in out-of-process mode gen roots will be excluded by AndroidExcludedJavaSourceRootProvider
|
||||
// we do it here for internal mode and also to make there roots 'visibly excluded' in IDE settings
|
||||
createGenModulesAndSourceRoots(project);
|
||||
@@ -149,9 +155,6 @@ public class AndroidPrecompileTask implements CompileTask {
|
||||
|
||||
private static boolean checkArtifacts(@NotNull CompileContext context) {
|
||||
final Project project = context.getProject();
|
||||
if (!ProjectFacetManager.getInstance(project).hasFacets(AndroidFacet.ID)) {
|
||||
return true;
|
||||
}
|
||||
final CompileScope scope = context.getCompileScope();
|
||||
|
||||
final Set<Artifact> artifacts = ApplicationManager.getApplication().runReadAction(new Computable<Set<Artifact>>() {
|
||||
|
||||
-122
@@ -1,122 +0,0 @@
|
||||
package org.jetbrains.android.compiler.artifact;
|
||||
|
||||
import com.intellij.openapi.application.ApplicationManager;
|
||||
import com.intellij.openapi.compiler.CompileContext;
|
||||
import com.intellij.openapi.compiler.CompileScope;
|
||||
import com.intellij.openapi.compiler.PackagingCompiler;
|
||||
import com.intellij.openapi.compiler.ValidityState;
|
||||
import com.intellij.openapi.util.Computable;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.io.DataInput;
|
||||
import java.io.DataOutput;
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* @author Eugene.Kudelevsky
|
||||
*/
|
||||
public class AndroidArtifactSigningCompiler implements PackagingCompiler {
|
||||
@Override
|
||||
public void processOutdatedItem(CompileContext context, String url, @Nullable ValidityState state) {
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public ProcessingItem[] getProcessingItems(CompileContext context) {
|
||||
return ApplicationManager.getApplication().runReadAction(new Computable<ProcessingItem[]>() {
|
||||
@Override
|
||||
public ProcessingItem[] compute() {
|
||||
return null;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public ProcessingItem[] process(CompileContext context, ProcessingItem[] items) {
|
||||
return new ProcessingItem[0]; //To change body of implemented methods use File | Settings | File Templates.
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public String getDescription() {
|
||||
return "Android Artifact Signing Compiler";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean validateConfiguration(CompileScope scope) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ValidityState createValidityState(DataInput in) throws IOException {
|
||||
return new MyValidityState(in);
|
||||
}
|
||||
|
||||
private static class MyProcessingItem implements ProcessingItem {
|
||||
private final VirtualFile myApkFile;
|
||||
private final AndroidArtifactSigningMode mySigningMode;
|
||||
private final String myDebugKeyStorePath;
|
||||
private final MyValidityState myValidityState;
|
||||
|
||||
private MyProcessingItem(@NotNull VirtualFile apkFile,
|
||||
@NotNull AndroidArtifactSigningMode signingMode,
|
||||
@Nullable String debugKeyStorePath) {
|
||||
myApkFile = apkFile;
|
||||
mySigningMode = signingMode;
|
||||
myDebugKeyStorePath = debugKeyStorePath;
|
||||
|
||||
myValidityState = new MyValidityState(myApkFile.getModificationStamp(),
|
||||
mySigningMode.name(),
|
||||
myDebugKeyStorePath);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public VirtualFile getFile() {
|
||||
return myApkFile;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ValidityState getValidityState() {
|
||||
return myValidityState;
|
||||
}
|
||||
}
|
||||
|
||||
private static class MyValidityState implements ValidityState {
|
||||
private final long myApkFileTimestamp;
|
||||
private final String mySigningMode;
|
||||
private final String myDebugKeyStorePath;
|
||||
|
||||
private MyValidityState(long apkFileTimestamp, @NotNull String signingMode, @NotNull String debugKeyStorePath) {
|
||||
myApkFileTimestamp = apkFileTimestamp;
|
||||
mySigningMode = signingMode;
|
||||
myDebugKeyStorePath = debugKeyStorePath;
|
||||
}
|
||||
|
||||
private MyValidityState(@NotNull DataInput in) throws IOException {
|
||||
myApkFileTimestamp = in.readLong();
|
||||
mySigningMode = in.readUTF();
|
||||
myDebugKeyStorePath = in.readUTF();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equalsTo(ValidityState otherState) {
|
||||
if (!(otherState instanceof MyValidityState)) {
|
||||
return false;
|
||||
}
|
||||
final MyValidityState state = (MyValidityState)otherState;
|
||||
return state.myApkFileTimestamp == myApkFileTimestamp &&
|
||||
state.mySigningMode.equals(mySigningMode) &&
|
||||
state.myDebugKeyStorePath.equals(myDebugKeyStorePath);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void save(DataOutput out) throws IOException {
|
||||
out.writeLong(myApkFileTimestamp);
|
||||
out.writeUTF(mySigningMode);
|
||||
out.writeUTF(myDebugKeyStorePath);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -309,7 +309,7 @@ class MockGit implements Git {
|
||||
}
|
||||
|
||||
static String commitMessageForCherryPick(GitCommit commit) {
|
||||
"$commit.subject\n(cherry-picked from ${commit.shortHash.getString()})"
|
||||
"$commit.subject\n\n(cherry-picked from ${commit.shortHash.getString()})"
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -160,7 +160,7 @@ hint: and commit the result with 'git commit'
|
||||
}
|
||||
|
||||
String newCommitMessage(GitCommit commit) {
|
||||
"${commit.description}\n(cherry-picked from ${commit.hash.value})"
|
||||
"${commit.description}\n\n(cherry-picked from ${commit.hash.value})"
|
||||
}
|
||||
|
||||
protected static class OKCommitDialogHandler implements MockVcsHelper.CommitHandler {
|
||||
|
||||
+1
-1
@@ -968,7 +968,7 @@ public class MavenProjectsManager extends MavenSimpleProjectComponent
|
||||
if (myProject.isDisposed()) return;
|
||||
|
||||
MavenFoldersImporter.updateProjectFolders(myProject, targetFoldersOnly);
|
||||
VirtualFileManager.getInstance().syncRefresh();
|
||||
VirtualFileManager.getInstance().asyncRefresh(null);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2009 JetBrains s.r.o.
|
||||
* Copyright 2000-2012 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -22,11 +22,13 @@ import org.jetbrains.annotations.Nullable;
|
||||
|
||||
/**
|
||||
* @author peter
|
||||
*/
|
||||
*/
|
||||
public class XmlName implements Comparable<XmlName> {
|
||||
private final String myLocalName;
|
||||
private final String myNamespaceKey;
|
||||
|
||||
private final int myHashCode;
|
||||
|
||||
public XmlName(@NotNull @NonNls final String localName) {
|
||||
this(localName, null);
|
||||
}
|
||||
@@ -34,6 +36,8 @@ public class XmlName implements Comparable<XmlName> {
|
||||
public XmlName(@NotNull @NonNls final String localName, @Nullable final String namespaceKey) {
|
||||
myLocalName = localName;
|
||||
myNamespaceKey = namespaceKey;
|
||||
|
||||
myHashCode = 31 * myLocalName.hashCode() + (myNamespaceKey != null ? myNamespaceKey.hashCode() : 0);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@@ -61,10 +65,7 @@ public class XmlName implements Comparable<XmlName> {
|
||||
}
|
||||
|
||||
public int hashCode() {
|
||||
int result;
|
||||
result = myLocalName.hashCode();
|
||||
result = 31 * result + (myNamespaceKey != null ? myNamespaceKey.hashCode() : 0);
|
||||
return result;
|
||||
return myHashCode;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user